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!
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 utilisantpip install pyqrcode
-
et ensuite utiliser le code:
>>> import pyqrcode >>> qr = pyqrcode.create("HORN O.K. PLEASE.") >>> qr.png("horn.png", scale=6)
- j'ai utilisé
-
décoder un fichier
qrcode
existant en utilisantqrtools
- Installer
qrtools
à l'aidesudo 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.'
- Installer
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 utilisantpip install pypng
pour utiliserpyqrcode
-
dans le cas où vous avez
PIL
installé, vous pourriez obtenirIOError: decoder zip not available
. Dans ce cas, essayez de désinstaller et de réinstallerPIL
en utilisant:pip uninstall PIL pip install PIL
-
si cela ne fonctionne pas, essayez d'utiliser
Pillow
au lieu de celapip uninstall PIL pip install pillow
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:
-
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 déclare un
ImportError: DLL load failed: The specified module could not be found.
quand vous faitesimport zbar
, alors vous allez juste besoin d'installer le Visual C++ redistribuable Packages for VS 2013 (j'ai passé beaucoup de temps ici, en essayant de recompiler sans succès...) -
Puis faites
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
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)])]