Как декодировать QR-код изображения в (Желательно чистый) Python?
TL; DR: мне нужен способ декодировать QR-код из файла изображения с помощью (предпочтительно чистого) Python.
у меня есть jpg-файл с QR-кодом, который я хочу декодировать с помощью Python. Я нашел пару библиотек, которые утверждают, что делают это:
PyQRCode (вот сайт) который предположительно может декодировать qr-коды из изображений, просто предоставляя путь следующим образом:
import sys, qrcode
d = qrcode.Decoder()
if d.decode('out.png'):
print 'result: ' + d.result
else:
print 'error: ' + d.error
так что я просто установил его с помощью sudo pip install pyqrcode
. Однако то, что я нахожу странным в приведенном выше примере кода, заключается в том, что он только импортирует qrcode
(а не pyqrcode
хотя), так как я думаю qrcode
относится к библиотека которые могут только создать qr-код изображения это как-то смутило меня. Поэтому я попробовал код выше с обоими pyqrcode
и qrcode
, но оба терпят неудачу во второй строке, говоря AttributeError: 'module' object has no attribute 'Decoder'
. Кроме того, сайте относится к Ubuntu 8.10 (который вышел более 6 несколько лет назад), и я не могу найти публичный (git или другой) репозиторий для проверки последней фиксации. Поэтому я перешел к следующей библиотеке:
ZBar (вот сайт) утверждает, что "an open source software suite for reading bar codes from various sources, such as image files."
поэтому я попытался установить его на Mac OSX под управлением sudo pip install zbar
. Это не удается с error: command 'cc' failed with exit status 1
. Я пробовал предложения в ответах на этот вопрос SO, но я не могу его решить. Поэтому я решил снова двигаться дальше:
QRTools, которые согласно этот блогпост можно легко декодировать изображения с помощью следующего кода:
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()
Итак, я попытался установить его с помощью sudo pip install qrtools
, который ничего не могу найти. Я также попробовал его с python-qrtools
,qr-tools
,python-qrtools
и еще несколько комбинаций, но, к сожалению, безрезультатно. Я полагаю, что это относится к этот РЕПО который говорит, что он основан на ZBar (см. выше). Хотя я хочу запустить свой код на Heroku (и, таким образом, предпочитаю чистое решение Python), я успешно установил его на Linux box (с sudo apt-get install python-qrtools
) и попытался запустить его:
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`)
хотя это, кажется, декодировать его, он, кажется, не делает это правильно. Кроме того, он нуждается в ZBar и, следовательно, не является чистым Python. Поэтому я решил найти еще одну библиотеку.
PyXing (вот сайт) предположительно является портом Python популярной Java библиотека ZXing, но первоначальная и единственная фиксация составляет 6 лет, и у проекта нет readme или документация вообще.
для остальных я нашел пару qr - enкодеры (не deкодеры) и некоторые конечные точки API, которые могут декодировать для вас. Поскольку мне не нравится, что эта служба зависит от других конечных точек API, я хотел бы сохранить локальное декодирование.
Итак, чтобы сделать вывод; кто-нибудь знает, как я могу декодировать QR-коды из изображений в (предпочтительном чистом) Python? Все советы приветствуются!
3 ответа:
вы можете попробовать следующие действия и код с помощью
qrtools
:
создать
qrcode
файл, если он еще не существует
- я
pyqrcode
для этого, который может быть установлен с помощьюpip install pyqrcode
а затем используйте код:
>>> import pyqrcode >>> qr = pyqrcode.create("HORN O.K. PLEASE.") >>> qr.png("horn.png", scale=6)
декодировать существующий
qrcode
файл с помощьюqrtools
- установить
qrtools
используяsudo apt-get install python-qrtools
теперь используйте следующий код в вашей строке python
>>> import qrtools >>> qr = qrtools.QR() >>> qr.decode("horn.png") >>> print qr.data u'HORN O.K. PLEASE.'
вот полный код в один проход:
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.
предостережения
- возможно, Вам потребуется установить
PyPNG
используяpip install pypng
использоватьpyqrcode
в случае, если у вас есть
PIL
установлен, вы можете сделатьIOError: decoder zip not available
. В таком случае, попробуйте удалить и переустановитьPIL
использование:pip uninstall PIL pip install PIL
если это не работает, попробуйте использовать
Pillow
вместоpip uninstall PIL pip install pillow
Я потратил почти полчаса, чтобы заставить его работать на Windows + Python 2.7 64-бит, поэтому вот дополнительные примечания к принятому ответу:
установить ему с
pip install zbar-0.10-cp27-none-win_amd64.whl
если Python сообщает
ImportError: DLL load failed: The specified module could not be found.
при выполненииimport zbar
, тогда вы просто нужно установите распространяемые пакеты Visual C++ для VS 2013 (Я провел здесь много времени, безуспешно пытаясь перекомпилировать...)затем сделать
pip install pyqrcode pip install qrtools pip install Pillow
и код из основного ответа должен работать:
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
следующий код отлично работает со мной:
brew install zbar pip install pyqrcode pip install pyzbar
для создания изображения QR-кода:
import pyqrcode qr = pyqrcode.create("test1") qr.png("test1.png", scale=6)
для расшифровки QR-кода:
from PIL import Image from pyzbar.pyzbar import decode data = decode(Image.open('test1.png')) print(data)
это выводит результат:
[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)])]