leer - ¿Cómo decodificar una imagen de código QR en Python(preferiblemente puro)?
python qr code reader (3)
TL; DR : necesito una forma de decodificar un código QR de un archivo de imagen usando Python (preferiblemente puro).
Tengo un archivo jpg con un código QR que quiero decodificar usando Python. He encontrado un par de bibliotecas que dicen hacer esto:
PyQRCode ( sitio web aquí ) que supuestamente puede decodificar códigos qr de imágenes simplemente proporcionando una ruta como esta:
import sys, qrcode
d = qrcode.Decoder()
if d.decode(''out.png''):
print ''result: '' + d.result
else:
print ''error: '' + d.error
Así que simplemente lo instalé usando
sudo pip install pyqrcode
.
Sin embargo, lo que me parece extraño sobre el código de ejemplo anterior es que solo importa
qrcode
(y no
pyqrcode
). Dado que creo que
qrcode
refiere a
esta biblioteca
que solo puede
generar
imágenes de código qr, me confundió.
Así que probé el código anterior con
pyqrcode
y
qrcode
, pero ambos fallan en la segunda línea que dice
AttributeError: ''module'' object has no attribute ''Decoder''
.
Además,
el sitio web se
refiere a Ubuntu 8.10 (que salió hace más de 6 años) y no puedo encontrar un repositorio público (git u otro) para verificar la última confirmación.
Así que pasé a la siguiente biblioteca:
ZBar
(
sitio web aquí
) afirma ser
"an open source software suite for reading bar codes from various sources, such as image files."
Así que intenté instalarlo en Mac OSX ejecutando
sudo pip install zbar
.
Esto falla con el
error: command ''cc'' failed with exit status 1
.
Intenté hacer sugerencias en las respuestas a
esta pregunta SO
, pero parece que no puedo resolverlo.
Así que decidí seguir adelante nuevamente:
QRTools , que de acuerdo con este blog puede decodificar imágenes fácilmente usando el siguiente 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()
Así que intenté instalarlo usando
sudo pip install qrtools
, que no puede encontrar nada.
También lo probé con
python-qrtools
,
qr-tools
,
python-qrtools
y un par de combinaciones más, pero desafortunadamente fue en vano.
Supongo que se refiere a
este repositorio
que dice que está basado en ZBar (ver arriba).
Aunque quiero ejecutar mi código en Heroku (y, por lo tanto, prefiero una solución pura de Python), lo instalé con éxito en una caja de Linux (con
sudo apt-get install python-qrtools
) e intenté ejecutarlo:
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`)
Aunque esto parece decodificarlo, no parece hacerlo correctamente. Además, necesita ZBar y, por lo tanto, no es Python puro. Así que decidí encontrar otra biblioteca más.
Se supone que PyXing ( sitio web aquí ) es un puerto de Python de la popular biblioteca Java ZXing , pero la confirmación inicial y única tiene 6 años y el proyecto no tiene léame ni documentación alguna.
Por lo demás, encontré un par de codificadores qr- en (no de codificadores) y algunos puntos finales de API que pueden decodificar para usted. Sin embargo, dado que no me gusta que este servicio dependa de otros puntos finales API, me gustaría mantener la decodificación local.
Para concluir; ¿Alguien sabría cómo puedo decodificar códigos QR de imágenes en Python (preferible puro)? ¡Todos los consejos son bienvenidos!
El siguiente código funciona bien conmigo:
brew install zbar
pip install pyqrcode
pip install pyzbar
Para la creación de imágenes de código QR:
import pyqrcode
qr = pyqrcode.create("test1")
qr.png("test1.png", scale=6)
Para la decodificación de código QR:
from PIL import Image
from pyzbar.pyzbar import decode
data = decode(Image.open(''test1.png''))
print(data)
que imprime el 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)])]
Pasé casi media hora para que funcione en Windows + Python 2.7 de 64 bits, así que aquí hay notas adicionales a la respuesta aceptada:
-
Instálelo con
pip install zbar-0.10-cp27-none-win_amd64.whl
-
Si Python informa un
ImportError: DLL load failed: The specified module could not be found.
alimport zbar
, solo necesitará instalar los paquetes redistribuibles de Visual C ++ para VS 2013 (pasé mucho tiempo aquí, intentando recompilar sin éxito ...) -
También se requiere: libzbar64-0.dll debe estar en una carpeta que se encuentra en la RUTA. En mi caso lo copié a "C: / Python27 / libzbar64-0.dll" (que está en la RUTA)
-
Entonces hazlo
pip install pyqrcode pip install qrtools pip install Pillow
y el código de la respuesta principal debería 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
Puede probar los siguientes pasos y códigos usando
qrtools
:
-
Cree un archivo
qrcode
, si aún no existe-
pyqrcode
para hacer esto, que se puede instalar usandopip install pyqrcode
-
Y luego usa el código:
>>> import pyqrcode >>> qr = pyqrcode.create("HORN O.K. PLEASE.") >>> qr.png("horn.png", scale=6)
-
-
Decodifica un archivo
qrcode
existente usandoqrtools
-
Instale
qrtools
usandosudo apt-get install python-qrtools
-
Ahora use el siguiente código dentro de su indicador de Python
>>> import qrtools >>> qr = qrtools.QR() >>> qr.decode("horn.png") >>> print qr.data u''HORN O.K. PLEASE.''
-
Instale
Aquí está el código completo en una sola ejecución:
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.
Advertencias
-
Es posible que necesite instalar
PyPNG
usandopip install pypng
para usarpyqrcode
-
En caso de que tenga instalado
PIL
, es posible que obtengaIOError: decoder zip not available
. En ese caso, intente desinstalar y reinstalarPIL
usando:pip uninstall PIL pip install PIL
-
Si eso no funciona, intente usar
Pillow
lugarpip uninstall PIL pip install pillow