如何解码(最好是纯粹的)Python中的QR码图像?

TL; DR :我需要一种方法来使用Python(更好的纯Python)来解码来自图像文件的QR码。

我有一个QR码,我想用Python解码的jpg文件。 我find了一些声称这样做的库:

PyQRCode ( 网站在这里 )据说可以通过简单地提供一个像这样的path解码图像的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来安装它。 但是,我发现上面的示例代码奇怪的是,它只是importqrcode (而不是pyqrcode虽然)因为我认为qrcode引用这个库只能生成 qr代码的图像有点困惑我。 所以我用pyqrcodeqrcode尝试了上面的代码,但都在第二行说AttributeError: 'module' object has no attribute 'Decoder'失败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." 所以我试着在运行sudo pip install zbar Mac OSX上sudo pip install zbar 。 这将失败, error: command 'cc' failed with exit status 1 。 我试图在这个SO问题的答案build议,但我似乎无法解决这个问题。 所以我决定继续前进:

QRTools根据这个blogpost可以解码图像很容易通过使用下面的代码:

 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-qrtoolsqr-toolspython-qrtools和更多的组合,但不幸的是无济于事。 我想这是指这个回购说,它是基于ZBar(见上文)。 虽然我想在Heroku上运行我的代码(因此更喜欢纯粹的Python解决scheme),但是我成功地将它安装在Linux机器上(使用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 '\xef\xbb\xbfNULL' where I expect an int (being `1234567890`) 

虽然这似乎解码它,似乎并没有做到这一点。 它还需要ZBar,因此不是纯粹的Python。 所以我决定再找一个图书馆。

PyXing ( 这里的网站 )被认为是stream行的Java ZXing库的一个Python端口,但是初始的和唯一的提交已经有6年的历史了,而且这个项目没有任何自述或文档。

其余的我find了几个qr en coders(而不是de coders)和一些可以为你解码的API端点。 由于我不喜欢这个服务依赖于其他的API端点,我想保持解码本地。

所以得出结论; 任何人都知道我怎么能解码图像(更好的纯Python)中的QR码? 所有的提示,欢迎!

您可以使用qrtools来尝试以下步骤和代码:

  • 创build一个qrcode文件,如果不存在的话

    • 我用pyqrcode做这个,可以用pip install pyqrcodepip install pyqrcode
    • 然后使用代码:

       >>> import pyqrcode >>> qr = pyqrcode.create("HORN OK PLEASE.") >>> qr.png("horn.png", scale=6) 
  • 使用qrtools解码现有的qrcode文件

    • 使用sudo apt-get install python-qrtools
    • 现在在你的python提示符下使用下面的代码

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

以下是一次完整的代码:

 In [2]: import pyqrcode In [3]: qr = pyqrcode.create("HORN OK 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 OK PLEASE. 

注意事项

  • 您可能需要使用pip install pypngpip install pypng来使用pyqrcode
  • 如果你安装了PIL ,你可能会得到IOError: decoder zip not available 。 在这种情况下, 尝试卸载并重新安装PIL使用:

     pip uninstall PIL pip install PIL 
  • 如果这不起作用,请尝试使用Pillow

     pip uninstall PIL pip install pillow