web-dev-qa-db-fra.com

Comment décoder une image de code QR en Python (de préférence pur)?

TL; DR : J'ai besoin d'un moyen de décoder un code QR à partir d'un fichier image à l'aide de Python (de préférence pur).

J'ai un fichier jpg avec un code QR que je veux décoder avec Python. J'ai trouvé quelques bibliothèques qui prétendent faire ceci:

PyQRCode ( website here ) pouvant soi-disant décoder les codes QR des images en fournissant simplement un chemin comme celui-ci:

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

Alors je l'ai simplement installé en utilisant Sudo pip install pyqrcode. Ce que je trouve étrange dans l’exemple de code ci-dessus, c’est qu’il importe uniquement qrcode (et non pyqrcode bien que) car je pense que qrcode fait référence à cette bibliothèque = qui ne peut que générer des images de code QR, cela me confond. J'ai donc essayé le code ci-dessus avec pyqrcode et qrcode, mais les deux échouent à la deuxième ligne en disant AttributeError: 'module' object has no attribute 'Decoder'. En outre, le site Web fait référence à Ubuntu 8.10 (qui est sorti il ​​y a plus de 6 ans) et je ne trouve pas de référentiel public (git ou autre) pour vérifier le dernier commit. Alors je suis passé à la bibliothèque suivante:

ZBar ( website here ) prétend être "an open source software suite for reading bar codes from various sources, such as image files." J'ai donc essayé de l'installer sous Mac OSX sous Sudo pip install zbar. Cela échoue avec error: command 'cc' failed with exit status 1. J'ai essayé de faire des suggestions dans les réponses à cette SO question , mais je n'arrive pas à résoudre le problème. Alors j'ai décidé de passer à nouveau:

QRTools , qui selon cet article de blog peut facilement décoder les images en utilisant le code suivant:

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()

J'ai donc essayé de l'installer avec Sudo pip install qrtools, qui ne trouve rien. Je l'ai aussi essayé avec python-qrtools, qr-tools, python-qrtools et quelques autres combinaisons, mais malheureusement sans résultat. Je suppose que cela fait référence à ce repo qui dit qu'il est basé sur ZBar (voir ci-dessus). Bien que je veuille exécuter mon code sur Heroku (et donc préférer une solution pure Python), je l'ai installé avec succès sur une machine Linux (avec Sudo apt-get install python-qrtools) et j'ai essayé de l'exécuter:

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`)

Bien que cela semble le décoder, il ne semble pas le faire correctement. De plus, il a besoin de ZBar et n'est donc pas du pur Python. J'ai donc décidé de trouver encore une autre bibliothèque.

PyXing ( website here ) est censé être un port Python du populaire Java bibliothèque ZXing , mais le premier et seul commit a 6 ans et le projet ne possède aucun fichier Lisez-moi ou documentation.

Pour le reste, j'ai trouvé un couple qr - en codeurs (pas de codeurs) et certains points de terminaison API qui peuvent décoder pour vous. Etant donné que je n'aime pas que ce service dépende d'autres points de terminaison de l'API, je souhaite toutefois conserver le décodage local.

Donc pour conclure; Quelqu'un sait-il comment je peux décoder les codes QR des images en Python (de préférence pur)? Tous les conseils sont les bienvenus!

69
kramer65

Vous pouvez essayer les étapes suivantes et utiliser le code en utilisant qrtools:

  • Créer un fichier qrcode, s'il n'existe pas déjà

    • J'ai utilisé pyqrcode pour le faire, ce qui peut être installé avec pip install pyqrcode
    • Et puis utilisez le code:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • Décoder un fichier qrcode existant en utilisant qrtools

    • Installez qrtools en utilisant Sudo apt-get install python-qrtools
    • Maintenant, utilisez le code suivant dans votre invite python

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

Voici le code complet en un seul passage:

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.

Mises en garde

  • Vous devrez peut-être installer PyPNG à l'aide de pip install pypng pour utiliser pyqrcode
  • Si vous avez installé PIL, vous pouvez obtenir IOError: decoder Zip not available. Dans ce cas, essayez de désinstaller et de réinstaller PIL en utilisant:

    pip uninstall PIL
    pip install PIL
    
  • Si cela ne fonctionne pas, essayez plutôt d'utiliser Pillow

    pip uninstall PIL
    pip install pillow
    
86
mu 無

Le code suivant fonctionne bien avec moi:

brew install zbar
pip install pyqrcode
pip install pyzbar

Pour créer une image de code QR:

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

Pour le décodage du code QR:

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

qui affiche le résultat:

[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)])]
4
Yuiq

J'ai passé presque une demi-heure à le faire fonctionner sous Windows + Python 2.7 _ 64 bits. Voici donc des notes supplémentaires à la réponse acceptée:

et le code de la réponse principale devrait fonctionner:

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
Basj