【问题标题】:Load blob image data into QPixmap将 blob 图像数据加载到 QPixmap
【发布时间】:2010-11-21 00:23:59
【问题描述】:

我正在为前端 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) 数据库中的十六进制字符串 -- 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 Image Object -->临时图像文件

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

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

TIA,

必应

【问题讨论】:

  • 你为什么还要使用 PIL 步骤? Qt 对加载 JPEG 数据非常满意:docs.huihoo.com/pyqt/pyqt4/html/…
  • 我确信 Qt 能够加载 JPEG 数据。我正在寻找的是一个代码 sn-p,它将 blob 字段中编码的字符串转换为 QPixmap 对象。谢谢!
  • 我发现我可以使用 QPixmap::loadFromData(cPickle.loads(s)) 其中 s 是从 blob 字段中获取的字符串数据。感谢您的帮助。

标签: python image pyqt blob qpixmap


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在谷歌搜索了一个半小时以解决类似问题后,我最终将 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 编译为 exe 的 setup.pycxfreeze.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用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        相关资源
        最近更新 更多