Pregunta

Estoy escribiendo un programa usando PyQt4 para la interfaz gráfica de usuario front-end y este programa tiene acceso a una base de datos back-end (que puede ser MySQL o SQLite). Necesito almacenar algunos datos de la imagen en la base de datos y a continuación es el código Python que utilizo para importar archivos de imagen (en formato JPEG) a un campo de datos blob en la base de datos:

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

Esta parte funciona bien. Mi pregunta es acerca de cómo crear un objeto QPixmap partir de los datos de imagen almacenados en la base de datos en PyQt4. Mi enfoque actual incluye los siguientes pasos:

(1) calle hexagonal en la base de datos - cPickle y StringIO -> PIL imagen del objeto

def load_image(s):
    o = cPickle.loads(s)
    c = StringIO.StringIO()
    c.write(o)
    c.seek(0)
    im = Image.open(c)
    return im

(2) Objeto PIL Imagen -> archivo de imagen temporal

(3) archivo de imagen temporal -> QPixmap

Este método también funciona bien. Pero sería mejor si yo no tengo que escribir / leer archivos de imágenes temporales que pueden ralentizar la respuesta del programa a las interacciones del usuario. Creo que podría utilizar QPixmap :: loadFromData () para directamente la carga de los datos BLOB almacenados en la base de datos y espero que alguien aquí me podría mostrar un ejemplo sobre cómo utilizar esta función.

TIA,

Bing

¿Fue útil?

Solución

Puede utilizar el método estático QImage.fromData para cargar una imagen de una cadena y luego convertirlo a un mapa de píxeles:

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

Otros consejos

El enfoque sugerido por hormigas Aasma obras y, de hecho, también es buena idea sólo tiene que utilizar el siguiente código:

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

Muchas gracias por toda la ayuda e información.

Después de una hora y media de googleing para resolver un problema similar, terminé JPEG carga en un .exe compilado con QT. Estoy usando python3.1, y por lo tanto no podía usar algunas de las soluciones mencionadas anteriormente:

  • puntas de trabajo para py2exe (porque estoy utilizando cxfreeze en lugar de py2exe, como py2exe sólo funciona para python2),
  • consejos que requieren PIL (también sólo para python2, que yo sepa).

Mientras que las soluciones incluidas en este documento no funcionó, hizo algo muy similar: Simplemente copiado el [PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats a la carpeta de mi exe y quité el archivo qt.conf que creé en esa carpeta siguiente otras soluciones. Eso es todo (creo: p).

Después de eso, funcionó si he cargado el jpg utilizando el constructor de QPixmap o cargando un QImage primero. También trabajó con ninguna opción especial que se necesita tanto para el setup.py y los métodos de compilación de cxfreeze.bat a exe usando cxfreeze.

(esta solución fue publicada por jbz en http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously- i-dont-sé-qué-hacer-con-que-cuando-youre-como-este / )

Esta pregunta es un poco viejo, pero como el problema parece estar todavía allí, espero que esta respuesta ayudará a los usuarios python3.1 por ahí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top