Como descodificar uma imagem de código QR em Python (de preferência pura)?
Tenho um ficheiro jpg com um código QR que quero descodificar usando Python. Encontrei algumas bibliotecas que afirmam fazer isto.TL; DR: preciso de uma forma de descodificar um código QR de um ficheiro de imagem usando Python (preferible pure).
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!
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 usandopip install pyqrcode
-
E depois usar o código:
>>> import pyqrcode >>> qr = pyqrcode.create("HORN O.K. PLEASE.") >>> qr.png("horn.png", scale=6)
- eu usei
-
Descodificar um ficheiro existente
qrcode
Usandoqrtools
- instalar
qrtools
Usandosudo 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.'
- instalar
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
usandopip install pypng
para utilizarpyqrcode
-
No caso de ter
PIL
instalado, pode terIOError: decoder zip not available
. Nesse caso, tente desinstalar e reinstalarPIL
utilização:pip uninstall PIL pip install PIL
-
Se isso não funcionar, tente usar
Pillow
em vez dissopip uninstall PIL pip install pillow
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:
Instale-o com
pip install zbar-0.10-cp27-none-win_amd64.whl
Se o Python comunicar um
ImportError: DLL load failed: The specified module could not be found.
ao fazerimport zbar
, então irá apenas ter de instalar os pacotes visuais C++ redistribuíveis para VS 2013 (passei muito tempo aqui, tentando recompilar sem sucesso...)-
Então faz
pip install pyqrcode pip install qrtools pip install Pillow
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
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)])]