Java如何生成读取条形码和二维码
本篇内容介绍了“Java如何生成读取条形码和二维码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
条形码
将宽度不等的多个黑条和白条,按照一定的编码规则排序,用以表达一组信息的图像标识符
通常代表一串数字 / 字母,每一位有特殊含义
一般数据容量30个数字 / 字母
二维码
用某种特定几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息
比一维条形码能存储更多信息,表示更多数据类型
能够存储数字 / 字母 / 汉字 / 图片等信息
可存储几百到几十KB字符
Zxing
Zxing主要是Google出品的,用于识别一维码和二维码的第三方库
主要类:
BitMatrix位图矩阵
MultiFormatWriter位图编写器
MatrixToImageWriter写入图片
Maven导入Zxing
<dependencies> <!--https://mvnrepository.com/artifact/com.google.zxing/javase--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.0.0</version> </dependency> </dependencies>
生成一维码java
publicstaticvoidmain(String[]args){ generateCode(newFile("1dcode.png"),"1390351289",500,250); } /** *@paramfile生成的文件名称 *@paramcode一维码存储的数据信息 *@paramwidth生成图片的宽度 *@paramheight生成图片的高度 *@returnvoid **/ publicstaticvoidgenerateCode(Filefile,Stringcode,intwidth,intheight){ //定义位图矩阵BitMatrix BitMatrixmatrix=null; try{ //使用code_128格式进行编码生成100*25的条形码 MultiFormatWriterwriter=newMultiFormatWriter(); matrix=writer.encode(code,BarcodeFormat.CODE_128,width,height,null); }catch(WriterExceptione){ e.printStackTrace(); } //将位图矩阵BitMatrix保存为图片 try{ FileOutputStreamoutputStream=newFileOutputStream(file); ImageIO.write(MatrixToImageWriter.toBufferedImage(matrix),"png",outputStream); outputStream.flush(); outputStream.close(); }catch(Exceptione){ e.printStackTrace(); } }
注意:一维码只能存储数字和字母,其他数据会报Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.0.0:exec (default-cli) on project MavenDemo: Command execution failed.错误java
读取一维码
publicstaticvoidmain(String[]args){ readCode(newFile("1dcode.png")); } /** *@paramreadImage读取一维码图片名 *@returnvoid **/ publicstaticvoidreadCode(FilereadImage){ try{ BufferedImageimage=ImageIO.read(readImage); if(image==null){ return; } LuminanceSourcesource=newBufferedImageLuminanceSource(image); BinaryBitmapbitmap=newBinaryBitmap(newHybridBinarizer(source)); Map<DecodeHintType,Object>hints=newHashMap<DecodeHintType,Object>(); hints.put(DecodeHintType.CHARACTER_SET,"gbk"); hints.put(DecodeHintType.PURE_BARCODE,Boolean.TRUE); hints.put(DecodeHintType.TRY_HARDER,Boolean.TRUE); Resultresult=newMultiFormatReader().decode(bitmap,hints); System.out.println(result.getText()); }catch(Exceptione){ e.printStackTrace(); } }
注意:当使用String类进行转码时,要使用Java.lang包的,Maven导包的时候会导入第三方Apache的String类
生成二维码
/**定义二维码的宽度*/ privatefinalstaticintWIDTH=300; /**定义二维码的高度*/ privatefinalstaticintHEIGHT=300; /**定义二维码的格式*/ privatefinalstaticStringFORMAT="png"; /** *@paramfile *@paramcontent *@returnvoid **/ publicstaticvoidgenerateQRCode(Filefile,Stringcontent){ //定义二维码参数 Map<EncodeHintType,Object>hints=newHashMap<EncodeHintType,Object>(); //设置编码 hints.put(EncodeHintType.CHARACTER_SET,"UTF-8"); //设置容错等级 hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.M); //设置边距,默认为5 hints.put(EncodeHintType.MARGIN,2); try{ BitMatrixbitMatrix=newMultiFormatWriter() .encode(content,BarcodeFormat.QR_CODE,WIDTH,HEIGHT,hints); Pathpath=file.toPath(); //保存到项目跟目录中 MatrixToImageWriter.writeToPath(bitMatrix,FORMAT,path); }catch(Exceptione){ e.printStackTrace(); } } publicstaticvoidmain(String[]args){ generateQRCode(newFile("smt.png"),"淑玫唐家居网"); }
读取二维码
/** *@paramfile读取二维码的文件名 *@returnvoid **/ publicstaticvoidreadQRCode(Filefile){ MultiFormatReaderreader=newMultiFormatReader(); try{ BufferedImageimage=ImageIO.read(file); BinaryBitmapbinaryBitmap=newBinaryBitmap(newHybridBinarizer(newBufferedImageLuminanceSource(image))); Map<DecodeHintType,Object>hints=newHashMap<>(); hints.put(DecodeHintType.CHARACTER_SET,"UTF-8"); Resultresult=reader.decode(binaryBitmap,hints); System.out.println("解析结果:"+newString(result.toString().getBytes("GBK"),"GBK")); System.out.println("二维码格式:"+result.getBarcodeFormat()); System.out.println("二维码文本内容:"+newString(result.getText().getBytes("GBK"),"GBK")); }catch(Exceptione){ e.printStackTrace(); } } publicstaticvoidmain(String[]args){ readQRCode(newFile("smt.png")); }
注意: Maven打印的控制台中会出现中文乱码,在IDEA Setting->maven->runner VMoptions:-Dfile.encoding=GB2312;即可解决
“Java如何生成读取条形码和二维码”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!