¿Cómo decodificar una imagen de código QR en Python (preferiblemente puro)?

TL; DR : Necesito una forma de descodificar un código QR de un archivo de imagen usando (preferiblemente, puro) Python.

Tengo un archivo jpg con un código QR que quiero descifrar usando Python. He encontrado un par de bibliotecas que dicen hacer esto:

PyQRCode ( sitio web aquí ) que supuestamente puede decodificar códigos qr a partir 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 en 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 diciendo AttributeError: 'module' object has no attribute 'Decoder' . Además, el sitio web hace referencia a Ubuntu 8.10 (que salió hace más de 6 años) y no puedo encontrar un repository público (git o de otro tipo) para verificar el último compromiso. 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é sugerencias en las respuestas a esta pregunta de SO , pero parece que no puedo resolverla. Así que decidí seguir adelante de nuevo:

QRTools , que de acuerdo con este blogpod 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 lamentablemente fue en vano. Supongo que se refiere a este repository 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 Python pura), lo instalé con éxito en una caja de Linux (con sudo apt-get install python-qrtools ) y traté de 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 descifrarlo, no parece hacerlo correctamente. Además, necesita ZBar y, por lo tanto, no es Python puro. Así que decidí buscar otra biblioteca.

PyXing (el sitio web aquí ) es supuestamente un puerto Python de la popular biblioteca de Java ZXing , pero el compromiso inicial y único es de 6 años y el proyecto no tiene ningún archivo Léame ni documentación.

Por lo demás, encontré un par de codificadores qr- en (no de codificadores) y algunos puntos finales de API que puede decodificar por usted. Sin embargo, dado que no me gusta que este servicio dependa de otros puntos finales de API, me gustaría mantener la deencoding local.

Así que para concluir; ¿Alguien sabría cómo puedo decodificar códigos QR de imágenes en Python (preferiblemente puro)? Todos los consejos son bienvenidos!

Puedes probar los siguientes pasos y código usando qrtools :

  • Crea un archivo qrcode , si aún no existe

    • Utilicé pyqrcode para hacer esto, que se puede instalar usando pip install pyqrcode
    • Y luego usa el código:

       >>> import pyqrcode >>> qr = pyqrcode.create("HORN OK PLEASE.") >>> qr.png("horn.png", scale=6) 
  • Decodifica un archivo qrcode existente usando qrtools

    • Instale qrtools utilizando sudo apt-get install python-qrtools
    • Ahora usa el siguiente código en tu indicador de python

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

Aquí está el código completo en una sola ejecución:

 In [2]: import pyqrcode In [3]: qr = pyqrcode.create("HORN OK 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 OK PLEASE. 

Advertencias

  • Es posible que necesite instalar PyPNG usando pip install pypng para usar pyqrcode
  • En caso de que tenga instalado PIL , puede obtener IOError: decoder zip not available . En ese caso, intente desinstalar y reinstalar PIL usando:

     pip uninstall PIL pip install PIL 
  • Si eso no funciona, intente usar Pillow lugar

     pip uninstall PIL pip install pillow 

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 decodificar el 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 hacer que funcionara en Windows + Python 2.7 de 64 bits, así que aquí hay notas adicionales a la respuesta aceptada:

  • Descargue https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_amd64.whl

  • 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. al realizar la import zbar , solo necesitará instalar los paquetes redistribuibles de Visual C ++ para VS 2013 (pasé mucho tiempo aquí, tratando de recomstackr sin éxito …)

  • También es necesario: libzbar64-0.dll debe estar en una carpeta que esté en la RUTA. En mi caso lo copié a “C: \ Python27 \ libzbar64-0.dll” (que está en el PATH)

  • 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 OK PLEASE.") qr.png("horn.png", scale=6) import qrtools qr = qrtools.QR() qr.decode("horn.png") print qr.data