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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。