7

我正在使用 PyQt4 为前端 GUI 编写程序,该程序访问后端数据库(可以是 MySQL 或 SQLite)。我需要在数据库中存储一些图像数据,下面是我用来将图像文件(JPEG 格式)导入数据库中的 blob 数据字段的 Python 代码:

def dump_image(imgfile):
    i = open(imgfile, 'rb')
    i.seek(0)
    w = i.read()
    i.close()
    return cPickle.dumps(w,1)

blob = dump_image(imgfile)
hex_str = blob.encode('hex') 
# x"%s"%hex_str will be the string inserted into the SQL command

这部分工作正常。我的问题是关于如何从存储在 PyQt4 数据库中的图像数据创建 QPixmap 对象。我目前的方法包括以下步骤:

(1) 数据库中的 Hex str -- cPickle&StringIO --> PIL Image Object

def load_image(s):
    o = cPickle.loads(s)
    c = StringIO.StringIO()
    c.write(o)
    c.seek(0)
    im = Image.open(c)
    return im

(2) PIL Image Object --> 临时图像文件

(3) 临时图像文件--> QPixmap

这种方法也很好用。但如果我不必写/读临时图像文件会更好,这可能会减慢程序对用户交互的响应。我想我可以使用QPixmap::loadFromData()直接从存储在数据库中的 blob 数据加载,并希望这里有人可以向我展示如何使用此函数的示例。

TIA,

必应

4

3 回答 3

11

您可以使用 QImage.fromData 静态方法从字符串加载图像,然后将其转换为像素图:

 image_data = get_image_data_from_blob()
 qimg = QtGui.QImage.fromData(image_data)
 pixmap = QtGui.QPixmap.fromImage(qimg)
于 2009-08-19T16:05:42.100 回答
4

Ants Aasma 建议的方法有效,实际上只使用以下代码也可以:

image_data = cPickle.loads(str(s)) # s is fetched from DB 
qp = QPixmap() 
qp.loadFromData(image_data) 

非常感谢所有的帮助和信息。

于 2009-08-19T19:02:15.427 回答
0

经过一个半小时的谷歌搜索以解决类似问题后,我最终将 JPEG 文件加载到使用 QT 编译的 .exe 文件中。我使用的是 python3.1,因此无法使用前面提到的一些解决方案:

  • 适用于 py2exe 的提示(因为我使用的是 cxfreeze 而不是 py2exe,因为 py2exe 仅适用于 python2),
  • 需要 PIL 的提示(也仅适用于 python2,afaik)。

虽然此处发布的解决方案不起作用,但非常相似:我只是将 复制[PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats到我的 exe 文件夹并删除了qt.conf我在其他解决方案之后在该文件夹中创建的文件。就是这样(我认为:p)。

之后,无论我使用QPixmap构造函数加载jpg还是加载QImage第一个,它都有效。它还可以在不需要特殊选项的情况下使用 cxfreeze 编译为 exesetup.pycxfreeze.bat方法。

(此解决方案由 jbz 在http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-上发布当你喜欢这个/

这个问题有点老了,但问题似乎仍然存在,我希望这个答案能帮助 python3.1 用户。

于 2010-02-06T13:32:12.047 回答