Jak dekodować obraz QR-code W (najlepiej czystym) Pythonie?

TL; DR: potrzebuję sposobu na dekodowanie kodu QR z pliku obrazu za pomocą (preferowanego czystego) Pythona.

Mam plik jpg z kodem QR, który chcę dekodować za pomocą Pythona. Znalazłem kilka bibliotek, które twierdzą, że to robią:

PyQRCode (strona internetowa tutaj ), która rzekomo może dekodować kody qr z obrazów, po prostu podając ścieżkę taką jak ta:

import sys, qrcode
d = qrcode.Decoder()
if d.decode('out.png'):
    print 'result: ' + d.result
else:
    print 'error: ' + d.error

Więc po prostu zainstalowałem go używając sudo pip install pyqrcode. The thing I find strange o przykładowym kodzie powyżej jest jednak to, że importuje tylko qrcode (a nie pyqrcode), ponieważ myślę, że qrcode odnosi się do tej biblioteki, która może tylko generować obrazy kodu qr. Więc wypróbowałem powyższy kod zarówno pyqrcode, jak i qrcode, ale oba zawiodły w drugiej linii mówiącej AttributeError: 'module' object has no attribute 'Decoder'. Co więcej, strona odnosi się do Ubuntu 8.10 (który wyszedł ponad 6 lat temu) i nie mogę znaleźć publicznego (git lub innego) repozytorium, aby sprawdzić najnowsze / align = "left" / Tak więc przeniosłem się do następnej biblioteki:

ZBar (strona tutaj ) twierdzi, że jest "an open source software suite for reading bar codes from various sources, such as image files." więc próbowałem zainstalować go na Mac OSX uruchomiony sudo pip install zbar. To nie działa z error: command 'cc' failed with exit status 1. Próbowałem podpowiedzieć w odpowiedziach na to pytanie , ale nie mogę go rozwiązać. Więc postanowiłem ruszyć dalej:

QRTools , które zgodnie z ten blogpost może łatwo dekodować obrazy za pomocą następującego kodu:

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

Więc próbowałem instalując go za pomocą sudo pip install qrtools, który nie może znaleźć niczego. Próbowałem też z python-qrtools, qr-tools, python-qrtools i jeszcze kilka kombinacji, ale niestety bezskutecznie. Przypuszczam, że odnosi się to do tego repo , który mówi, że jest oparty na ZBar(patrz wyżej). Chociaż chcę uruchomić mój kod na Heroku (a więc preferuję czyste rozwiązanie Pythona), pomyślnie zainstalowałem go na Linuksie (z sudo apt-get install python-qrtools) i próbowałem go uruchomić: {]}

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

Chociaż wydaje się, że to dekoduje, nie wydaje się tego robić prawidłowo. Ponadto potrzebuje ZBar i dlatego nie jest czystym Pythonem. Więc postanowiłem znaleźć kolejną bibliotekę.

PyXing (website here ) jest przypuszczalnie portem popularnej biblioteki Java ZXing , ale początkowy i jedyny commit ma 6 lat i projekt nie ma readme ani Dokumentacji.

Dla reszty znalazłem kilka qr - en koderów (Niede koderów) i kilka punktów końcowych API, które mogą dekodować dla Ciebie. Od Kiedy Ja nie podoba mi się, aby ta usługa była zależna od innych punktów końcowych API, chciałbym jednak zachować dekodowanie lokalne.

Tak podsumowując; czy ktoś wie, jak Mogę dekodować QR-kody z obrazów w (najlepiej czystym) Pythonie? Wszystkie porady są mile widziane!

Author: Community, 2014-12-01

3 answers

Możesz wypróbować następujące kroki i Kod za pomocą qrtools:

  • Utwórz plik qrcode, Jeśli jeszcze nie istnieje

    • użyłem pyqrcode do tego celu, które można zainstalować za pomocą pip install pyqrcode
    • A następnie użyj kodu:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • Dekodowanie istniejącego pliku qrcode za pomocą qrtools

    • zainstaluj qrtools używając sudo apt-get install python-qrtools
    • Teraz użyj poniższego kodu w swoim Pythonie prompt

      >>> import qrtools
      >>> qr = qrtools.QR()
      >>> qr.decode("horn.png")
      >>> print qr.data
      u'HORN O.K. PLEASE.'
      
Oto Pełny kod w jednym uruchomieniu:
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.

Caveats

  • może być konieczne zainstalowanie PyPNG za pomocą pip install pypng do użycia pyqrcode
  • W przypadku, gdy masz PIL zainstalowany, możesz uzyskać IOError: decoder zip not available. W takim przypadku, spróbuj odinstalować i ponownie zainstalować PIL użycie:

    pip uninstall PIL
    pip install PIL
    
  • Jeśli to nie zadziała, spróbuj użyć Pillow zamiast
    pip uninstall PIL
    pip install pillow
    
 75
Author: mu 無,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:43

Spędziłem prawie pół godziny, aby to działało na Windows + Python 2.7 64-bit, więc oto dodatkowe uwagi do zaakceptowanej odpowiedzi:

I kod z głównej odpowiedzi powinien działać:

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
 2
Author: Basj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-20 14:38:13

Następujący kod działa dobrze ze mną:

brew install zbar
pip install pyqrcode
pip install pyzbar

Do tworzenia obrazu z kodem QR:

import pyqrcode
qr = pyqrcode.create("test1")
qr.png("test1.png", scale=6)

Do dekodowania kodu QR:

from PIL import Image
from pyzbar.pyzbar import decode
data = decode(Image.open('test1.png'))
print(data)

Wypisuje wynik:

[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)])]
 1
Author: Yuiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 15:15:40