Comment décoder une image QR-code dans (de préférence pure) Python?

TL;DR : j'ai besoin d'un moyen de décoder un QR-code à partir d'un fichier image en utilisant (de préférence pur) Python.

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

PyQRCode ( site Web ici ) qui est censé pouvoir décoder les codes qr à partir d'images par simple fournissant 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

donc je l'ai simplement installé en utilisant sudo pip install pyqrcode . La chose que je trouve étrange au sujet du code d'exemple ci-dessus, cependant, est qu'il importe seulement qrcode (et pas pyqrcode cependant) puisque je pense que qrcode se réfère à cette bibliothèque qui ne peut que générer QR-Code des images qu'il sorte de me confus. Donc j'ai essayé le code ci-dessus avec les deux pyqrcode et qrcode , mais les deux échec à la deuxième ligne disant AttributeError: 'module' object has no attribute 'Decoder' . En outre, le site se réfère à Ubuntu 8.10 (qui est sorti il y a plus de 6 ans) et je ne peux pas trouver un dépôt public (git ou autre) de celui-ci pour vérifier la dernière propagation. Je suis donc 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." donc j'ai essayé de l'installer sur Mac OSX tournant sudo pip install zbar . Cette échoue avec error: command 'cc' failed with exit status 1 . J'ai essayé de suggérer dans les réponses à cette question ainsi , mais je ne semble pas pouvoir résoudre. J'ai donc décidé d'aller de l'avant à nouveau:

QRTools , qui selon ce blogpost peut décoder des images facilement 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()

donc j'ai essayé de l'installer en utilisant sudo pip install qrtools , qui ne trouve rien. J'ai aussi essayé avec python-qrtools , qr-tools , python-qrtools et quelques autres combinaisons, mais malheureusement en vain. Je suppose qu'il se réfère à ce rapport 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 Python pure), j'ai réussi à l'installer sur une machine Linux (avec sudo apt-get install python-qrtools ) et 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 'xefxbbxbfNULL' where I expect an int (being `1234567890`)

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

PyXing ( website here ) est supposé être un port Python du populaire Java ZXing library , mais le commit initial et unique date de 6 ans et le projet n'a pas de readme ou de documentation.

Pour le reste, j'ai trouvé un couple qr- fr codeurs (pas de codeurs) et certains paramètres API qui peuvent décoder pour vous. Comme je n'aime pas que ce service soit dépendant d'autres paramètres de L'API, je voudrais garder le décodage local.

donc pour conclure, est-ce que quelqu'un sait comment je peux décoder les QR-codes à partir d'images en (préférablement pures) Python? Tous les conseils sont les bienvenus!

54
demandé sur Community 2014-12-01 19:58:42

3 réponses

vous pouvez essayer les étapes et le code suivants en utilisant qrtools :

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

    • j'ai utilisé pyqrcode pour ce faire, qui peut être installé en utilisant pip install pyqrcode
    • et ensuite utiliser 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

    • Installer qrtools à l'aide sudo apt-get install python-qrtools
    • utilisez maintenant 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 pourriez avoir besoin d'installer PyPNG en utilisant pip install pypng pour utiliser pyqrcode
  • dans le cas où vous avez PIL installé, vous pourriez 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 d'utiliser Pillow au lieu de cela

    pip uninstall PIL
    pip install pillow
    
75
répondu mu 無 2017-05-23 12:25:43

j'ai passé près d'une demi-heure à le faire fonctionner sur Windows + Python 2.7 64-bit, donc voici 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
répondu Basj 2018-05-20 14:38:13

le code suivant fonctionne très bien avec moi:

brew install zbar
pip install pyqrcode
pip install pyzbar

pour la création d'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 imprime 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)])]
1
répondu Yuiq 2018-09-20 15:15:40