Como descodificar uma imagem de código QR em Python (de preferência pura)?

TL; DR: preciso de uma forma de descodificar um código QR de um ficheiro de imagem usando Python (preferible pure).

Tenho um ficheiro jpg com um código QR que quero descodificar usando Python. Encontrei algumas bibliotecas que afirmam fazer isto.

PyQRCode (site aqui ) que supostamente pode descodificar códigos qr de imagens, simplesmente fornecendo um caminho como este:

import sys, qrcode
d = qrcode.Decoder()
if d.decode('out.png'):
    print 'result: ' + d.result
else:
    print 'error: ' + d.error

Então eu simplesmente instalei-o usando sudo pip install pyqrcode. O que encontro estranho sobre o código de exemplo acima, no entanto, é que ele só importa qrcode (e não pyqrcode embora) uma vez que eu acho qrcode se refere a esta biblioteca que só pode gerar-imagens de código qr que ele meio que me confundiu. Então eu tentei o código acima com ambos pyqrcode e qrcode, mas ambos falham na segunda linha dizendo AttributeError: 'module' object has no attribute 'Decoder'. Além disso, o site refere-se ao Ubuntu 8.10 (que saiu há mais de 6 anos) e não consigo encontrar um repositório público (git ou outro) dele para verificar o último compromisso. Por isso, mudei-me para a próxima biblioteca.

ZBar (o site aqui afirma ser "an open source software suite for reading bar codes from various sources, such as image files." então eu tentei instalá-lo no Mac OSX executando sudo pip install zbar. Isto falha com error: command 'cc' failed with exit status 1. Tentei sugestões nas respostas a esta pergunta, mas não consigo resolvê-la. Então decidi seguir em frente novamente.

QRTools , que de acordo com Este blogpost pode descodificar imagens facilmente usando o seguinte código:

from qrtools import QR
myCode = QR(filename=u"/home/psutton/Documents/Python/qrcodes/qrcode.png")
if myCode.decode():
  print myCode.data
  print myCode.data_type
  print myCode.data_to_string()
Por isso tentei. instalá-lo usando sudo pip install qrtools, que não consegue encontrar nada. Eu também tentei com python-qrtools, qr-tools, python-qrtools e mais algumas combinações, mas infelizmente sem sucesso. Suponho que se refere a Este repo {[31] } que diz que é baseado em ZBar (ver acima). Embora eu queira executar o meu código em Heroku (e assim preferir uma solução Python pura), instalei-o com sucesso numa caixa Linux (com sudo apt-get install python-qrtools) e tentei executá-lo:

from qrtools import QR
c = QR(filename='/home/kramer65/qrcode.jpg')
c.data  # prints u'NULL'
c.data_type  # prints u'text'
c.data_to_string()  # prints '\xef\xbb\xbfNULL' where I expect an int (being `1234567890`)
Embora isto pareça descodificá-lo, não parece fazê-lo. correctamente. Além disso, ele precisa de ZBar e, portanto, não é Python puro. Então decidi encontrar outra biblioteca.

PyXing (o website aqui é supostamente uma porta em Python da popular biblioteca Java } ZXing , mas o commit inicial e único tem 6 anos e o projecto não tem qualquer readme ou documentação.

para o resto encontrei um par de codificadores qr-en (Não decodificadores) e alguns endpoints API que podem descodificar para si. Desde Que Eu não gosto que este serviço seja dependente de outros endpoints API eu gostaria de manter a decodificação local embora.

então, para concluir, alguém sabe como posso descodificar os códigos QR a partir de imagens em Python (puro preferível)? Todas as dicas são bem-vindas!

Author: Community, 2014-12-01

3 answers

Você pode tentar os seguintes passos e código usando qrtools:

  • Crie um ficheiro qrcode, se já não existir

    • eu usei pyqrcode para fazer isso, que pode ser instalado usando pip install pyqrcode
    • E depois usar o código:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • Descodificar um ficheiro existente qrcode Usando qrtools

    • instalar qrtools Usando sudo apt-get install python-qrtools
    • Agora use o seguinte código dentro do seu python prompt

      >>> import qrtools
      >>> qr = qrtools.QR()
      >>> qr.decode("horn.png")
      >>> print qr.data
      u'HORN O.K. PLEASE.'
      

Aqui está o código completo numa única execução:

In [2]: import pyqrcode
In [3]: qr = pyqrcode.create("HORN O.K. PLEASE.")
In [4]: qr.png("horn.png", scale=6)
In [5]: import qrtools
In [6]: qr = qrtools.QR()
In [7]: qr.decode("horn.png")
Out[7]: True
In [8]: print qr.data
HORN O.K. PLEASE.

advertências

  • pode ser necessário instalar PyPNG usando pip install pypng para utilizar pyqrcode
  • No caso de ter PIL instalado, pode ter IOError: decoder zip not available. Nesse caso, tente desinstalar e reinstalar PIL utilização:

    pip uninstall PIL
    pip install PIL
    
  • Se isso não funcionar, tente usar Pillow em vez disso

    pip uninstall PIL
    pip install pillow
    
 75
Author: mu 無, 2017-05-23 12:25:43

Passei quase meia hora a fazer com que funcionasse no Windows + Python 2.7 64-bit, por isso aqui estão notas adicionais para a resposta aceite:

E o código da resposta principal deve funcionar:

import pyqrcode
qr = pyqrcode.create("HORN O.K. PLEASE.")
qr.png("horn.png", scale=6)
import qrtools
qr = qrtools.QR()
qr.decode("horn.png")
print qr.data
 2
Author: Basj, 2018-05-20 14:38:13

O seguinte código funciona bem comigo:

brew install zbar
pip install pyqrcode
pip install pyzbar

Para a criação de uma imagem de código QR:

import pyqrcode
qr = pyqrcode.create("test1")
qr.png("test1.png", scale=6)

Para descodificação de código QR:

from PIL import Image
from pyzbar.pyzbar import decode
data = decode(Image.open('test1.png'))
print(data)

Que imprime o resultado:

[Decoded(data=b'test1', type='QRCODE', rect=Rect(left=24, top=24, width=126, height=126), polygon=[Point(x=24, y=24), Point(x=24, y=150), Point(x=150, y=150), Point(x=150, y=24)])]
 1
Author: Yuiq, 2018-09-20 15:15:40