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!
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à
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
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
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
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)])]
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:
Télécharger https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_AMD64.whl
Installez-le avec pip install zbar-0.10-cp27-none-win_AMD64.whl
Si Python signale un ImportError: DLL load failed: The specified module could not be found.
en faisant import zbar
, vous aurez juste besoin d'installer le - Packages redistribuables Visual C++ pour VS 201 (J'ai passé beaucoup de temps ici à essayer de recompiler sans succès ...)
Requis aussi: libzbar64-0.dll doit être dans un dossier qui se trouve dans le PATH. Dans mon cas, je l'ai copié dans "C:\Python27\libzbar64-0.dll" (qui se trouve dans le chemin d'accès).
Alors fais
pip install pyqrcode
pip install qrtools
pip install Pillow
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