Java调用pyzbar解析base64二维码过程解析
一、环境配置
所有OS,建议使用python3.6;python2.7也可以,但在安装过程中可能遇到升级pip等问题;请参考pyzbar官网https://pypi.org/project/pyzbar/
1.Ubuntu16.4
apt-getinstalllibzbar0
pipinstallpyzbar
pipinstallPillow
2.Centos7
yuminstallpython-devel
yuminstallzbar-devel
yuminstallzbarpipinstallPillow
pipinstallpyzbar
3.Windows
pipinstallPillow
pipinstallpyzbar
还需安装VisualC++RedistributablePackagesforVisualStudio2013,即从微软官方下载的vcredist_x64.exe程序
二、代码编写
Java代码
UserController.java
packagecom.yang.springbootlucene.controller;
importlombok.Data;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.core.io.ClassPathResource;
importorg.springframework.web.bind.annotation.RequestBody;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjava.io.File;
importjava.io.FileWriter;
importjava.io.IOException;
/**
*@author:yjx
*@description:
*@date:2019/11/2815:29
*/
@Slf4j
@RestController
@RequestMapping("/user")
publicclassUserController{
@Value("${pyzbar.script}")
privateStringscriptPath;
privatestaticfinalStringBASE_64_PREFIX="data:image/png;base64,";
/**
*这种方式在源码中成功调用,但达成jar包后,找不到脚本路径,所以脚本必须放在外面
*/
@Deprecated
privatestaticStringpyZbarScriptPath;
/*static{
ClassPathResourcepathResource=newClassPathResource("/script/my_py_zbar.py");
try{
pyZbarScriptPath=pathResource.getFile().getAbsolutePath();
}catch(IOExceptione){
e.printStackTrace();
}
}*/
@RequestMapping("/cameraScanPyZbar")
publicObjectcameraScanPyZbar(@RequestBodyStringbase64)throwsIOException{
if(this.checkBase64Head(base64)){
//1.去掉base64字符的头部
Stringbase64Str=this.cutHead(base64);
//2.创建临时文件(由于图片的base64字符太长,不支持直接以命令参数的形式传递,故将字符串写入临时文件,而后python程序读取临时文件内容)
StringtempPath="./"+Thread.currentThread().getName();
FiletempFile=newFile(tempPath);
FileWriterfileWriter=newFileWriter(tempFile,false);
fileWriter.write(base64Str);
fileWriter.flush();
fileWriter.close();
//3.调用pyzbar解析base64字符串
StringplainText=PyZbarUtil.executePyzbar("python",scriptPath,tempFile.getAbsolutePath());
//4.删除临时文件
tempFile.delete();
System.err.println("--------->"+plainText);
returnplainText;
}else{
return"参数格式错误";
}
}
/**
*校验Base64值是否已规定的串开始
*
*@parambase64
*@return
*/
privatebooleancheckBase64Head(Stringbase64){
returnbase64.startsWith(BASE_64_PREFIX);
}
/**
*Base64去头
*
*@parambase64
*@return
*/
privateStringcutHead(Stringbase64){
returnbase64.replaceAll(BASE_64_PREFIX,"");
}
}
PyZbarUtil.java
packagecom.yang.springbootlucene.controller;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
publicfinalclassPyZbarUtil{
/**
*脚本执行工具类
*
*@paramlang命令语言
*@paramscriptPath脚本绝对路劲
*@parambase64Pathbase64文件绝对路径
*@return
*/
publicstaticStringexecutePyzbar(Stringlang,StringscriptPath,Stringbase64Path){
String[]arguments=newString[]{lang,scriptPath,base64Path};
try{
Processprocess=Runtime.getRuntime().exec(arguments);
intre=process.waitFor();
if(re==0){
try(BufferedReaderin=newBufferedReader(newInputStreamReader(process.getInputStream(),"GBK"));){
returnin.readLine();
}
}else{
System.err.println("脚本调用失败");
}
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
}
python脚本my_py_zbar.py
#-*-coding:UTF-8-*-
importsys
importbase64
fromioimportBytesIO
importpyzbar.pyzbaraspyzbar
fromPILimportImage,ImageEnhance
'''将base64转换为字节流'''
defconvert_base64_to_byte_stream(base64_str):
#1.解码Base64字符串
img_data=base64.b64decode(base64_str)
#2.将节码结果转为字节流
byte_stream=BytesIO(img_data)
returnbyte_stream
'''从将字节流解析二维码'''
defparse_byte_stream_qr_code(byte_stream):
#3.打开字节流得到图片对象
img=Image.open(byte_stream)
img=ImageEnhance.Brightness(img).enhance(2.0)#增加亮度
img=ImageEnhance.Contrast(img).enhance(4.0)#增加对比度
#img=ImageEnhance.Sharpness(img).enhance(17.0)#锐利化
#img=img.convert('L')#灰度化
#img.show()#播放图片,供测试用
#4.调用pyzbar解析图片中的二维码
barcodes=pyzbar.decode(img)
#5.打印解析结果
returnbarcodes[0].data.decode("utf-8")
defmain(argv):
#print(parse_byte_stream_qr_code(convert_base64_to_byte_stream(argv[1])))
print(parse_byte_stream_qr_code(convert_base64_to_byte_stream(open(argv[1]).readline())))
if__name__=="__main__":
main(sys.argv)
三、主要坑点
- 图片转base64后,得到的字符串太长,不能直接以命令参数的形式传递,所以必须将其写入临时文件,然后python脚本读取临时文件进行解析
- 若将python脚本放在项目中,项目打成jar包后,无法定位脚本路径,导致执行失败,所以必须将脚本放在jar包外,以配置的形式将路径传递给java项目
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。