将Blob图像数据加载到QPixmap中

7 投票
3 回答
12865 浏览
提问于 2025-04-15 13:42

我正在用PyQt4写一个程序,这个程序的前端是图形用户界面(GUI),而且它会访问一个后端数据库(可以是MySQL或者SQLite)。我需要在数据库里存储一些图片数据,下面是我用来把JPEG格式的图片文件导入到数据库的一个代码:

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

这部分运行得很好。我的问题是,如何从数据库中存储的图片数据创建一个QPixmap对象。在我现在的做法中,步骤如下:

(1) 数据库中的十六进制字符串 -- 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数据,而不需要写入或读取临时图片文件,那就更好了,因为这样可能会让程序在用户交互时反应变慢。我想我可以使用QPixmap::loadFromData()直接从数据库中加载数据,希望这里有人能给我一个使用这个函数的例子。

谢谢大家,

Bing

3 个回答

0

经过一个半小时的谷歌搜索,我终于在用QT的编译.exe文件中加载JPEG图片。我使用的是python3.1,所以有些之前提到的解决方案我不能用:

  • 一些适用于py2exe的建议(因为我用的是cxfreeze,而py2exe只支持python2),
  • 还有一些需要PIL的建议(我知道的也是只支持python2)。

虽然这里的解决方案没能解决我的问题,但有个很相似的方法有效了:我简单地把 [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的用户们。

4

Ants Aasma 提出的这个方法是有效的,实际上你也可以直接使用下面的代码:

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

非常感谢大家的帮助和信息。

11

你可以使用QImage.fromData这个静态方法,从一个字符串中加载一张图片,然后把它转换成一个pixmap(图像对象)。

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

撰写回答