赞
踩
项目地址:https://github.com/oostendo/python-zxing
项目实际就是下载3个jar包,subprocess调用一下而已,比较简单。
1、下载3个依赖包,放在python-zxing中。
相关命令:
- git clone https://github.com/oostendo/python-zxing.git
-
- cd python-zxing
-
- wget http://central.maven.org/maven2/com/google/zxing/core/3.3.3/core-3.3.3.jar
-
- wget http://central.maven.org/maven2/com/google/zxing/javase/3.3.3/javase-3.3.3.jar
-
- wget http://central.maven.org/maven2/com/beust/jcommander/1.72/jcommander-1.72.jar
2、执行命令:setup.py install
E:\python-zxing>python setup.py install
running install
running build
running build_py
creating build
creating build\lib
creating build\lib\zxing
copying zxing\tests.py -> build\lib\zxing
copying zxing\__init__.py -> build\lib\zxing
running install_lib
creating C:\Python27\Lib\site-packages\zxing
copying build\lib\zxing\tests.py -> C:\Python27\Lib\site-packages\zxing
copying build\lib\zxing\__init__.py -> C:\Python27\Lib\site-packages\zxing
byte-compiling C:\Python27\Lib\site-packages\zxing\tests.py to tests.pyc
byte-compiling C:\Python27\Lib\site-packages\zxing\__init__.py to __init__.pyc
running install_egg_info
Removing C:\Python27\Lib\site-packages\zxing-0.1-py2.7.egg-info
Writing C:\Python27\Lib\site-packages\zxing-0.1-py2.7.egg-info
3、这里看到zxing被安装到了C:\Python27\Lib\site-packages\zxing
将core-3.3.3.jar、javase-3.3.3.jar、jcommander-1.72.jar复制到:\Python27\Lib\site-packages\zxing这个目录下
3、修改上面路径下的__init__.py文件
libs = ["javase/javase.jar", "core/core.jar"]
改为
libs = [r"C:\Python27\Lib\site-packages\zxing\javase-3.3.3.jar", r"C:\Python27\Lib\site-packages\zxing\core-3.3.3.jar", r"C:\Python27\Lib\site-packages\zxing\jcommander-1.72.jar"]
loc = ".."
改为:
loc = ""
for result in file_results:
lines = stdout.split("\n")
改为
for result in file_results:
print result
lines = stdout.split("\n")
4.运行tests即可输出
E:\python-zxing\zxing>tests.py
file:///E:/python-zxing/zxing/sample.png (format: QR_CODE, type: URI):
Raw result:
http://tinyurl.com/openmichiganrsvp
Parsed result:
http://tinyurl.com/openmichiganrsvp
Found 4 result points.
Point 0: (75.5,273.5)
Point 1: (75.5,75.5)
Point 2: (273.5,75.5)
Point 3: (246.5,246.5)
注意,如果你自己使用时,识别的图片路径是绝对路径,会报错:
from zxing import *
import sys
def test_codereader(image_path):
zx = BarCodeReader()
barcode = zx.decode(image_path)
print barcode.data
if __name__=="__main__":
test_codereader(sys.argv[1])
E:\>python mywork.py e:\pic\sample.png
报错:
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
at java.base/sun.nio.fs.WindowsUriSupport.fromUri(WindowsUriSupport.java:122)
at java.base/sun.nio.fs.WindowsFileSystemProvider.getPath(WindowsFileSystemProvider.java:93)
at java.base/java.nio.file.Path.of(Path.java:203)
at java.base/java.nio.file.Paths.get(Paths.java:97)
at com.google.zxing.client.j2se.CommandLineRunner.expand(CommandLineRunner.java:112)
at com.google.zxing.client.j2se.CommandLineRunner.main(CommandLineRunner.java:76)
你只需要改变一下传入路径,变为:
E:\>python mywork.py file:/e:/pic/sample.png
file:/e:/pic/sample.png (format: QR_CODE, type: URI):
Raw result:
http://tinyurl.com/openmichiganrsvp
Parsed result:
http://tinyurl.com/openmichiganrsvp
Found 4 result points.
Point 0: (75.5,273.5)
Point 1: (75.5,75.5)
Point 2: (273.5,75.5)
Point 3: (246.5,246.5)
http://tinyurl.com/openmichiganrsvp
所有py文件代码:
__init__.py:
- ########################################################################
- #
- # zxing.py -- a quick and dirty wrapper for zxing for python
- #
- # this allows you to send images and get back data from the ZXing
- # library: http://code.google.com/p/zxing/
- #
- # by default, it will expect to be run from the zxing source code directory
- # otherwise you must specify the location as a parameter to the constructor
- #
-
- __version__ = '0.3'
- import subprocess, re, os
-
- class BarCodeReader():
- location = ""
- command = "java"
- libs = [r"C:\Python27\Lib\site-packages\zxing\javase-3.3.3.jar", r"C:\Python27\Lib\site-packages\zxing\core-3.3.3.jar", r"C:\Python27\Lib\site-packages\zxing\jcommander-1.72.jar"]
- args = ["-cp", "LIBS", "com.google.zxing.client.j2se.CommandLineRunner"]
-
- def __init__(self, loc=""):
- if not len(loc):
- if (os.environ.has_key("ZXING_LIBRARY")):
- loc = os.environ["ZXING_LIBRARY"]
- else:
- loc = ""
-
- self.location = loc
-
- def decode(self, files, try_harder = False, qr_only = False):
- cmd = [self.command]
- cmd += self.args[:] #copy arg values
- if try_harder:
- cmd.append("--try_harder")
- if qr_only:
- cmd.append("--possibleFormats=QR_CODE")
-
- libraries = [self.location + "/" + l for l in self.libs]
-
- cmd = [ c if c != "LIBS" else os.pathsep.join(libraries) for c in cmd ]
-
- # send one file, or multiple files in a list
- SINGLE_FILE = False
- if type(files) != type(list()):
- cmd.append(files)
- SINGLE_FILE = True
- else:
- cmd += files
-
- (stdout, stderr) = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True).communicate()
- codes = []
- file_results = stdout.split("\nfile:")
- for result in file_results:
- print result
- lines = stdout.split("\n")
- if re.search("No barcode found", lines[0]):
- codes.append(None)
- continue
-
- codes.append(BarCode(result))
-
- if SINGLE_FILE:
- return codes[0]
- else:
- return codes
-
- #this is the barcode class which has
- class BarCode:
- format = ""
- points = []
- data = ""
- raw = ""
-
- def __init__(self, zxing_output):
- lines = zxing_output.split("\n")
- raw_block = False
- parsed_block = False
- point_block = False
-
- self.points = []
- for l in lines:
- m = re.search("format:\s([^,]+)", l)
- if not raw_block and not parsed_block and not point_block and m:
- self.format = m.group(1)
- continue
-
- if not raw_block and not parsed_block and not point_block and l == "Raw result:":
- raw_block = True
- continue
-
- if raw_block and l != "Parsed result:":
- self.raw += l + "\n"
- continue
-
- if raw_block and l == "Parsed result:":
- raw_block = False
- parsed_block = True
- continue
-
- if parsed_block and not re.match("Found\s\d\sresult\spoints", l):
- self.data += l + "\n"
- continue
-
- if parsed_block and re.match("Found\s\d\sresult\spoints", l):
- parsed_block = False
- point_block = True
- continue
-
- if point_block:
- m = re.search("Point\s(\d+):\s\(([\d\.]+),([\d\.]+)\)", l)
- if (m):
- self.points.append((float(m.group(2)), float(m.group(3))))
-
- return
-
-
- if __name__ == "__main__":
- print("ZXing module")
tests.py:
- #!/usr/bin/env python
- from zxing import *
-
- zxing_location = ".."
- testimage = "sample.png"
-
-
-
-
- def test_barcode_parser():
- text = """
- file:/home/oostendo/Pictures/datamatrix/4-contrastcrop.bmp (format: DATA_MATRIX, type: TEXT):
- Raw result:
- 36MVENBAEEAS04403EB0284ZB
- Parsed result:
- 36MVENBAEEAS04403EB0284ZB
- Also, there were 4 result points.
- Point 0: (24.0,18.0)
- Point 1: (21.0,196.0)
- Point 2: (201.0,198.0)
- Point 3: (205.23952,21.0)
- """
-
- barcode = BarCode(text)
- if (barcode.format != "DATA_MATRIX"):
- return 0
-
- if (barcode.raw != "36MVENBAEEAS04403EB0284ZB"):
- return 0
-
- if (barcode.data != "36MVENBAEEAS04403EB0284ZB"):
- return 0
-
- if (len(barcode.points) != 4 and barcode.points[0][0] != 24.0):
- return 0
-
- return 1
-
-
- def test_codereader():
- #~ zx = BarCodeReader(zxing_location)
- zx = BarCodeReader()
-
- barcode = zx.decode(testimage)
-
- if re.match("http://", barcode.data):
- return 1
-
- return 0
-
- if __name__=="__main__":
- test_codereader()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。