Python 将blob图像数据加载到QPixmap中

Python 将blob图像数据加载到QPixmap中,python,image,pyqt,blob,qpixmap,Python,Image,Pyqt,Blob,Qpixmap,我正在为前端GUI编写一个使用PyQt4的程序,该程序访问后端数据库(可以是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 = d

我正在为前端GUI编写一个使用PyQt4的程序,该程序访问后端数据库(可以是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) 数据库中的十六进制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

这种方法也很有效。但是如果我不必写/读临时图像文件,这会使程序对用户交互的响应变慢,那就更好了。我想我可以直接从数据库中存储的blob数据加载,希望这里的人能给我展示一个如何使用这个函数的示例

蒂亚


Bing

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

 image_data = get_image_data_from_blob()
 qimg = QtGui.QImage.fromData(image_data)
 pixmap = QtGui.QPixmap.fromImage(qimg)

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

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

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

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

  • 为py2exe工作的提示(因为我使用的是cxfreeze而不是py2exe,因为py2exe只适用于python2)
  • 需要PIL的提示(也仅适用于python2,afaik)
虽然此处发布的解决方案不起作用,但一些非常类似的解决方案起了作用: 我只是简单地将
[PythonDir]\Lib\site packages\PyQt4\plugins\imageformats
复制到我的exe文件夹中,并删除了我按照其他解决方案在该文件夹中创建的
qt.conf
文件。就这些(我想是p)

在那之后,无论我是使用
QPixmap
的构造函数还是先加载
QImage
加载jpg,它都能工作。对于使用cxfreeze编译为exe的
setup.py
cxfreeze.bat
方法,它也不需要特别的选项

(此解决方案由jbz于发布)


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

为什么还要使用PIL步骤?Qt对加载JPEG数据非常满意:我确信Qt能够加载JPEG数据。我要寻找的是一个代码片段,它将blob字段中编码的字符串转换为QPixmap对象。谢谢我发现我可以使用QPixmap::loadFromData(cPickle.loads(s)),其中s是从blob字段获取的字符串数据。谢谢你的帮助。