Как декодировать изображение 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 или другой) репозиторий, чтобы проверить последнюю фиксацию. Поэтому я перешел к следующей библиотеке:--22-->
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
. Я попытался предложения в ответах на это так вопрос, но я не могу его решить. Поэтому я решил двигаться дальше:--22-->
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)])]