Pergunta

Eu estou escrevendo um programa usando PyQt4 para front-end GUI e este programa acessa um banco de dados back-end (que pode ser tanto MySQL ou SQLite). Eu preciso armazenar alguns dados de imagem no banco de dados e abaixo está o código Python que eu uso para arquivos de imagem de importação (em formato JPEG) para um campo de dados blob no banco de dados:

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 bem. A minha pergunta é sobre como criar um objeto QPixmap a partir dos dados de imagem armazenados no banco de dados em PyQt4. Minha abordagem atual envolve as seguintes etapas:

(1) Hex str no banco de dados - cPickle & StringIO -> Objeto PIL Imagem

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 Imagem Object -> arquivo de imagem temporário

(3) arquivo de imagem temporário -> QPixmap

Essa abordagem também funciona bem. Mas seria melhor se eu não tenho que escrever / ler arquivos de imagem temporários que podem retardar a resposta do programa a interações do usuário. Eu acho que eu poderia usar QPixmap :: loadFromData () para diretamente carga a partir dos dados blob armazenados no banco de dados e espero que alguém aqui poderia me mostrar um exemplo de como usar esta função.

TIA,

Bing

Foi útil?

Solução

Você pode usar o método estático QImage.fromData para carregar uma imagem de uma corda e depois convertê-lo em um pixmap:

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

Outras dicas

A abordagem sugerida por formigas Aasma funciona e na verdade também é OK para usar apenas o seguinte código:

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

Muito obrigado por toda a ajuda e informação.

Depois de uma boa hora e meia de googleing para resolver um problema semelhante, acabei JPEGs de carregamento em um .exe compilado com QT. Eu estou usando python3.1, e, portanto, não poderia utilizar algumas das soluções mencionadas anteriormente:

  • dicas que trabalham para py2exe (porque eu estou usando cxfreeze vez de py2exe, como py2exe funciona apenas para python2),
  • dicas que exigem PIL (também apenas para python2, afaik).

Enquanto as soluções postadas aqui não funcionou, algo muito semelhante fez: Eu simplesmente copiou o [PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats a pasta do meu exe e removeu o arquivo qt.conf que eu criei nessa pasta seguir outras soluções. Isso é tudo (eu penso: p).

Depois disso, ele trabalhou se eu carreguei o jpg usando o construtor de QPixmap ou carregando um QImage primeiro. Ele também trabalhou com nenhuma opção especial é necessária tanto para o setup.py e os métodos cxfreeze.bat de compilação para exe usando cxfreeze.

(esta solução foi postado por JBZ em http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously- i-dont-sabe-o-que-fazer-com-você-quando-youre-como-presente / )

Esta questão é um pouco velho, mas como o problema parece ser ainda lá, espero que esta resposta vai ajudar os usuários a python3.1 lá fora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top