Загрузите данные изображения blob в QPixmap
Вопрос
Я пишу программу, использующую PyQt4 для графического пользовательского интерфейса, и эта программа обращается к внутренней базе данных (которая может быть MySQL или SQLite).Мне нужно сохранить некоторые данные изображения в базе данных, и ниже приведен код Python, который я использую для импорта файлов изображений (в формате 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 из данных изображения, хранящихся в базе данных в 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() напрямую загрузить данные из больших двоичных объектов, хранящихся в базе данных, и надеяться, что кто-нибудь здесь покажет мне пример использования этой функции.
ТИА,
Бинг
Решение
Вы можете использовать статический метод QImage.fromData для загрузки изображения из строки, а затем преобразовать его в растровое изображение:
image_data = get_image_data_from_blob()
qimg = QtGui.QImage.fromData(image_data)
pixmap = QtGui.QPixmap.fromImage(qimg)
Другие советы
Подход, предложенный Антсом Аасмой, работает, и на самом деле можно просто использовать следующий код:
image_data = cPickle.loads(str(s)) # s is fetched from DB
qp = QPixmap()
qp.loadFromData(image_data)
Большое спасибо за всю помощь и информацию.
После полутора часов поисков в Google для решения аналогичной проблемы я загрузил файлы JPEG в скомпилированный .exe-файл с помощью QT.Я использую python3.1 и поэтому не могу использовать некоторые из ранее упомянутых решений:
- советы по работе с py2exe (поскольку я использую cxfreeze вместо py2exe, поскольку py2exe работает только с python2),
- советы, требующие PIL (также только для Python2, кстати).
Хотя решения, опубликованные здесь, не сработали, сработало нечто очень похожее:я просто скопировал [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-seriiously-i-dont-know-what-do-do-with-you-when-youre-like-this/)
Этот вопрос немного устарел, но, поскольку проблема, похоже, все еще существует, я надеюсь, что этот ответ поможет пользователям Python3.1.