2009-08-19 1 views
4

Я пишу программу с использованием PyQt4 для интерфейсного графического интерфейса, и эта программа обращается к внутренней базе данных (которая может быть либо MySQL, либо SQLite). Мне нужно хранить некоторые данные изображения в базе данных и ниже код Python я использовать для импорта файлов изображений (в формате JPEG) в поле данных BLOB в базе данных:Загрузить данные изображения блоба в QPixmap

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 из данных изображения, хранящихся в базе данных в PyQt4. Мой текущий подход включает в себя следующие этапы:

(1) Hex ул в базе данных - 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 -> файл временного изображения

(3) Файл временного изображения -> QPixmap

Этот подход также отлично работает. Но было бы лучше, если бы мне не приходилось писать/читать временные файлы изображений, что может замедлить реакцию программы на взаимодействие с пользователем. Я думаю, я мог бы использовать QPixmap::loadFromData() для прямой загрузки из данных blob, хранящихся в базе данных, и надеюсь, что кто-то здесь может показать мне пример того, как использовать эту функцию.

ТИА,

Bing

+0

Почему вы даже используете шаг PIL? Qt отлично справляется с загрузкой данных в формате JPEG: http://docs.huihoo.com/pyqt/pyqt4/html/qpixmap.html#reading-and-writing-image-files – balpha

+0

Я уверен, что Qt может загружать данные JPEG. Я ищу фрагмент кода, который преобразует строку, закодированную в поле blob, в объект QPixmap. Благодаря! –

+0

Я понял, что могу просто использовать QPixmap :: loadFromData (cPickle.loads (s)), где s - строковые данные, полученные из поля blob. Спасибо за помощь. –

ответ

8

Вы можете использовать статический метод 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) 

Большое спасибо за всю помощь и информацию.

0

После хорошего часа с половиной googleing, чтобы решить подобную проблему, я закончил загрузку JPEG-файлов в скомпилированном .exe с QT. Я использую python3.1, и, следовательно, не может использовать некоторые из ранее упомянутых решений:

  • советы рабочих для py2exe (потому что я использую cxfreeze вместо py2exe как py2exe работает только для python2)
  • советы, которые требуют PIL (также только для python2, afaik).

Хотя решения, размещенные здесь не работали, то очень похожее сделало: я просто скопировал [PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats в папку моего EXE и удалил файл qt.conf, который я создал в этой папке следующего других решений. Вот и все (я думаю: p).

После этого он работал независимо от того, загрузил ли я jpg с помощью конструктора QPixmap или сначала загрузил QImage. Он также работал без специальной опции, необходимой для методов setup.py и cxfreeze.bat для компиляции в exe с использованием cxfreeze.

(это решение было опубликовано 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 там.

Смежные вопросы