我正在使用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图像对象
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图像对象 - >临时图像文件
(3)临时图像文件 - >的QPixmap
这种方法也可以。但是如果我不必编写/读取临时图像文件会更好,这可能会减慢程序对用户交互的响应速度。我想我可以使用QPixmap::loadFromData()直接从数据库中存储的blob数据加载,希望这里有人能告诉我如何使用这个函数的例子。
TIA,
冰
答案 0 :(得分:9)
您可以使用QImage.fromData静态方法从字符串加载图像,然后将其转换为像素图:
image_data = get_image_data_from_blob()
qimg = QtGui.QImage.fromData(image_data)
pixmap = QtGui.QPixmap.fromImage(qimg)
答案 1 :(得分:3)
Ants Aasma建议的方法有效,实际上也可以使用以下代码:
image_data = cPickle.loads(str(s)) # s is fetched from DB
qp = QPixmap()
qp.loadFromData(image_data)
非常感谢所有的帮助和信息。
答案 2 :(得分:0)
经过一段半时间的google来解决类似的问题后,我最终在带有QT的编译.exe中加载了JPEG。我使用的是python3.1,因此无法使用前面提到的一些解决方案:
虽然这里发布的解决方案不起作用,但是非常类似的事情:
我只是将[PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats
复制到我的exe文件夹中,并删除了我在其他解决方案中创建的qt.conf
文件。这就是全部(我认为:p)。
之后,无论我是使用QPixmap
的构造函数加载jpg还是首先加载QImage
,它都能正常工作。对于使用cxfreeze进行编译的setup.py
和cxfreeze.bat
方法,它也没有特殊选项。
(此解决方案由jbz发布在http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/)
这个问题有点陈旧,但由于问题似乎仍然存在,我希望这个答案能帮助python3.1用户。