将blob图像数据加载到QPixmap

2024-09-30 00:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为前端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

这种方法也很有效。但如果我不必编写/读取临时图像文件,这可能会降低程序对用户交互的响应速度,那会更好。我想我可以使用QPixmap::loadFromData()直接从数据库中存储的blob数据加载,希望这里有人能给我演示如何使用这个函数。

蒂亚


Tags: 数据对象图像imagegt程序数据库图像文件
3条回答

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

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

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

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

虽然这里发布的解决方案不起作用,但类似的解决方案却起了作用: 我只是简单地将[PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats复制到我的exe文件夹中,然后删除在该文件夹中创建的qt.conf文件,该文件遵循其他解决方案。就这些(我想:p)。

之后,不管我是使用QPixmap的构造函数加载jpg,还是先加载QImage都可以工作。使用cxfreeze编译成exe的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的用户。

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

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

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

相关问题 更多 >

    热门问题