2014-12-01 18 views
44

TL; DR: Tôi cần một cách để giải mã mã QR từ tệp hình ảnh bằng cách sử dụng Python (thích hợp hơn).Làm thế nào để giải mã một hình ảnh mã QR trong (tốt hơn là thuần túy) Python?

Tôi có tệp jpg có mã QR mà tôi muốn giải mã bằng Python. Tôi đã tìm thấy một vài thư viện mà tuyên bố để làm điều này:

PyQRCode (website here) được cho là có thể giải mã mã qr từ hình ảnh bằng cách đơn giản cung cấp một con đường như thế này:

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

Vì vậy, tôi chỉ đơn giản là cài đặt nó sử dụng sudo pip install pyqrcode. Tuy nhiên, điều tôi thấy lạ về mã ví dụ ở trên là nó chỉ nhập qrcode (và không phải pyqrcode) Vì tôi nghĩ qrcode đề cập đến this library chỉ có thể tạo ra hình ảnh mã QR. Vì vậy, tôi đã thử mã ở trên với cả hai số pyqrcodeqrcode, nhưng cả hai đều không thành công ở dòng thứ hai là AttributeError: 'module' object has no attribute 'Decoder'. Hơn nữa, the website đề cập đến Ubuntu 8.10 (xuất hiện cách đây hơn 6 năm) và tôi không thể tìm thấy kho lưu trữ công cộng (git hoặc khác) để kiểm tra cam kết mới nhất. Vì vậy, tôi chuyển sang thư viện tiếp theo:

ZBar (website here) tuyên bố là "an open source software suite for reading bar codes from various sources, such as image files." Vì vậy, tôi đã cố gắng cài đặt nó trên Mac OSX chạy sudo pip install zbar. Điều này không thành công với error: command 'cc' failed with exit status 1. Tôi đã cố gắng để đề xuất trong các câu trả lời cho this SO question, nhưng tôi dường như không thể giải quyết nó. Vì vậy, tôi quyết định ra đi một lần nữa:

QRTools, mà theo this blogpost có thể giải mã hình ảnh một cách dễ dàng bằng cách sử dụng đoạn mã sau:

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

Vì vậy, tôi đã cố gắng cài đặt nó bằng cách sử sudo pip install qrtools, mà không thể tìm thấy bất cứ điều gì. Tôi cũng đã thử nó với python-qrtools, qr-tools, python-qrtools và một vài kết hợp khác, nhưng rất tiếc là không có kết quả. Tôi cho rằng nó đề cập đến this repo mà nói nó được dựa trên ZBar (xem ở trên). Mặc dù tôi muốn chạy mã của tôi trên Heroku (và do đó muốn có một giải pháp Python tinh khiết) Tôi thành công cài đặt nó trên một hộp Linux (với sudo apt-get install python-qrtools) và cố gắng chạy nó:

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

Mặc dù điều này dường như để giải mã nó, Nó dường như không làm điều đó một cách chính xác. Nó cũng cần ZBar và do đó không phải là Python thuần túy. Vì vậy, tôi quyết định tìm một thư viện khác.

PyXing (website here) được cho là một cổng Python trong những phổ biến Java ZXing library, nhưng ban đầu và chỉ cam kết là 6 tuổi và dự án không có readme hoặc tài liệu nào.

Đối với phần còn lại tôi tìm thấy một vài qr- en lập trình (không de lập trình) và một số điểm cuối API mà có thể giải mã cho bạn. Vì tôi không thích dịch vụ này phụ thuộc vào các thiết bị đầu cuối API khác, nên tôi muốn giữ địa chỉ giải mã mặc dù.

Vì vậy, để kết luận; ai sẽ biết làm thế nào tôi có thể giải mã QR-mã từ hình ảnh trong (thích hợp tinh khiết) Python? Tất cả các mẹo đều được chào đón!

+0

Nó nên là: 'nếu myCode.decode ("/ home/kramer65 /qrcode.jpg ")" và không phải là 'QR (tên tệp ='/home/kramer65/qrcode.jpg ')' –

+0

Tôi cảm thấy điều đáng nói đến là một câu hỏi tiếp theo được đặt ra bởi ** @ kramer65 ** về cách cài đặt ' zbar' với 'pip': http://stackoverflow.com/questions/27406641/how-to-install-python-bindings-originating-from-an-a pt-package – Nez

Trả lời

64

Bạn có thể thử các bước và mã sau sử dụng qrtools:

  • Tạo một file qrcode, nếu không nói là đã tồn tại

    • tôi đã sử dụng pyqrcode để làm điều này, có thể được cài đặt bằng pip install pyqrcode
    • Và sau đó sử dụng mã:

      >>> import pyqrcode 
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.") 
      >>> qr.png("horn.png", scale=6) 
      
  • Giải mã một qrcode tập tin hiện có sử dụng qrtools

    • Install qrtools sử dụng sudo apt-get install python-qrtools
    • Bây giờ sử dụng đoạn mã sau trong cửa sổ python của bạn

      >>> import qrtools 
      >>> qr = qrtools.QR() 
      >>> qr.decode("horn.png") 
      >>> print qr.data 
      u'HORN O.K. PLEASE.' 
      

Đây là mã hoàn chỉnh trong một hoạt động duy nhất:

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. 

Hãy cẩn thận

  • Bạn có thể cần phải cài đặt PyPNG sử dụng pip install pypng cho việc sử dụng pyqrcode
  • Trong trường hợp bạn đã cài đặt PIL, bạn có thể nhận được IOError: decoder zip not available. Trong trường hợp đó, try uninstalling and reinstalling PIL sử dụng:

    pip uninstall PIL 
    pip install PIL 
    
  • Nếu điều đó không làm việc, hãy thử sử dụng Pillow thay

    pip uninstall PIL 
    pip install pillow 
    
+1

Xin chào mu 無, cảm ơn câu trả lời của bạn. Mặc dù qrtools yêu cầu zbar và do đó không phải là python thuần túy, nó thực sự hoạt động ngay bây giờ. Vấn đề chính bây giờ là tôi cần phải cài đặt các python zbar ràng buộc trên heroku, về mà tôi hỏi một câu hỏi ở đây: http://stackoverflow.com/questions/27406641/how-to-install-python-bindings-originating-from -an-apt-package. Tôi sẽ chấp nhận câu trả lời của bạn, nhưng tôi sẽ đánh giá rất cao nếu bạn cũng có một cái nhìn vào câu hỏi khác của tôi để tôi có thể giải quyết chạy qrtools trên heroku. Cảm ơn rất nhiều! – kramer65

+0

@ kramer65 Thật không may, tôi không có nhiều kinh nghiệm với heroku, vì vậy tôi không chắc chắn cách gói được cài đặt ở đó ... –

+3

Điều này không có tác dụng, cung cấp Ngoại lệ: tostring() đã bị xóa. –

Các vấn đề liên quan