Вопрос по image, blob, python, pyqt, qpixmap – Загрузить данные изображения блоба в QPixmap

5

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

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) шестнадцатеричная строка в базе данных - 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-данных, хранящихся в базе данных, и надеяться, что кто-то здесь сможет показать мне пример использования этой функции.

ТИА,

Bing

Я уверен, что Qt способен загружать данные JPEG. Я ищу фрагмент кода, который преобразует строку, закодированную в поле blob, в объект QPixmap. Спасибо! Bing Jian
Я понял, что могу просто использовать QPixmap :: loadFromData (cPickle.loads (s)), где s - это строковые данные, извлеченные из поля blob. Спасибо за помощь. Bing Jian
Почему вы даже используете шаг PIL? Qt совершенно доволен загрузкой данных JPEG:docs.huihoo.com/pyqt/pyqt4/html/... balpha♦

Ваш Ответ

3   ответа
0

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

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

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

После этого сработало, загрузил ли я 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.

9

чтобы загрузить изображение из строки и затем преобразовать его в растровое изображение:

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

предложенный Антсом Аасмой, работает, и на самом деле можно использовать следующий код:

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

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

Похожие вопросы