Как декодировать 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 54

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-бит, поэтому вот дополнительные примечания к принятому ответу:

и код из основного ответа должен работать:

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)])]