Load blob image data into QPixmap
Asked Answered
B

3

7

I am writing a program using PyQt4 for front-end GUI and this program accesses a back-end database (which can be either MySQL or SQLite). I need to store some image data in the database and below is the Python code I use to import image files (in JPEG format) to a blob data field in the database:

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

This part works fine. My question is about how to create a QPixmap object from the image data stored in the database in PyQt4. My current approach involves the following steps:

(1) Hex str in database -- cPickle&StringIO --> PIL Image Object

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 -->Temporary image file

(3) Temporary image file --> QPixmap

This approach also works fine. But it would be better if I don't have to write/read temporary image files which may slow down the program response to user interactions. I guess I could use QPixmap::loadFromData() to directly load from the blob data stored in the database and hope someone here could show me an example on how to use this function.

TIA,

Bing

Bohannan answered 19/8, 2009 at 15:52 Comment(3)
Why do you even use the PIL step? Qt is perfectly happy with loading JPEG data: docs.huihoo.com/pyqt/pyqt4/html/…Peak
I am sure Qt is able to load JPEG data. What I am looking for is a code snippet that converts the string encoded in the blob field to the QPixmap object. Thanks!Bohannan
I figured out I can just use QPixmap::loadFromData(cPickle.loads(s)) where s is the string data fetched from the blob field. Thanks for the help.Bohannan
O
11

You can use the QImage.fromData static method to load an image from a string and then convert it to a pixmap:

 image_data = get_image_data_from_blob()
 qimg = QtGui.QImage.fromData(image_data)
 pixmap = QtGui.QPixmap.fromImage(qimg)
Ortegal answered 19/8, 2009 at 16:5 Comment(0)
B
4

The approach suggested by Ants Aasma works and actually it is also OK to just use the following code:

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

Thanks a lot for all the help and information.

Bohannan answered 19/8, 2009 at 19:2 Comment(0)
P
0

After a good hour and a half of googleing to solve a similar problem, I ended up loading JPEGs in a compiled .exe with QT. I am using python3.1, and therefore could not use some of the previously mentioned solutions :

  • tips working for py2exe (because I am using cxfreeze instead of py2exe, as py2exe works only for python2),
  • tips that require PIL (also only for python2, afaik).

While the solutions posted here didn't work, something very similar did : I simply copied the [PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats to my exe's folder and removed the qt.conf file that I created in that folder following other solutions. That's all (I think :p).

After that, it worked whether I loaded the jpg using QPixmap's constructor or loading a QImage first. It also worked with no special option needed for both the setup.py and the cxfreeze.bat methods of compiling to exe using cxfreeze.

(this solution was posted by jbz on http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/)

This question is a bit old, but as the problem seems to be still there, I hope this answer will help python3.1 users out there.

Pendant answered 6/2, 2010 at 13:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.