Java zxing生成条形码和二维吗代码实例
在如今的生活中,二维码随处可见,二维码的出现既减少了宣传纸张的浪费,又方便了人们的生活。这一篇我来说说Java利用第三方Jar包zxing生成二维码。
依赖
com.google.zxing core 3.3.3 com.google.zxing javase 3.3.3
生成二维码
packagecode; importcom.google.zxing.*; importcom.google.zxing.common.BitMatrix; importcom.google.zxing.qrcode.decoder.ErrorCorrectionLevel; importorg.apache.commons.codec.binary.Base64; importorg.apache.commons.codec.binary.Base64OutputStream; importjavax.imageio.ImageIO; importjava.awt.*; importjava.awt.image.BufferedImage; importjava.io.*; importjava.util.HashMap; importjava.util.Map; publicclassQRCodeKit{ publicstaticfinalStringQRCODE_DEFAULT_CHARSET="UTF-8"; publicstaticfinalintQRCODE_DEFAULT_HEIGHT=300; publicstaticfinalintQRCODE_DEFAULT_WIDTH=300; privatestaticfinalintBLACK=0xFF000000; privatestaticfinalintWHITE=0xFFFFFFFF; publicstaticvoidmain(String[]args)throwsIOException,NotFoundException{ Stringdata="https://www.jianshu.com/p/748aa03cc1e8?ddd=dsdsdsdsddsdsdsdsdsdsdsdsd"; FilelogoFile=newFile("C:/1.png"); BufferedImageimage=QRCodeKit.createQRCodeWithLogo(data,logoFile); ImageIO.write(image,"png",newFile("D:/result7.png")); System.out.println("done"); } /** *Createqrcodewithdefaultsettings * *@paramdata *@return *@authorstefli */ publicstaticBufferedImagecreateQRCode(Stringdata){ returncreateQRCode(data,QRCODE_DEFAULT_WIDTH,QRCODE_DEFAULT_HEIGHT); } /** *Createqrcodewithdefaultcharset * *@paramdata *@paramwidth *@paramheight *@return *@authorstefli */ publicstaticBufferedImagecreateQRCode(Stringdata,intwidth,intheight){ returncreateQRCode(data,QRCODE_DEFAULT_CHARSET,width,height); } /** *Createqrcodewithspecifiedcharset * *@paramdata *@paramcharset *@paramwidth *@paramheight *@return *@authorstefli */ publicstaticBufferedImagecreateQRCode(Stringdata,Stringcharset,intwidth,intheight){ Maphint=newHashMap(); hint.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H); hint.put(EncodeHintType.CHARACTER_SET,charset); returncreateQRCode(data,charset,hint,width,height); } /** *Createqrcodewithspecifiedhint * *@paramdata *@paramcharset *@paramhint *@paramwidth *@paramheight *@return *@authorstefli */ publicstaticBufferedImagecreateQRCode(Stringdata,Stringcharset,Maphint,intwidth, intheight){ BitMatrixmatrix; try{ matrix=newMultiFormatWriter().encode(newString(data.getBytes(charset),charset),BarcodeFormat.QR_CODE, width,height,hint); returntoBufferedImage(matrix); }catch(WriterExceptione){ thrownewRuntimeException(e.getMessage(),e); }catch(Exceptione){ thrownewRuntimeException(e.getMessage(),e); } } /** *toBufferedImage * *@parammatrix *@return */ publicstaticBufferedImagetoBufferedImage(BitMatrixmatrix){ intwidth=matrix.getWidth(); intheight=matrix.getHeight(); BufferedImageimage=newBufferedImage(width,height, BufferedImage.TYPE_INT_RGB); for(intx=0;x hint, intwidth,intheight,FilelogoFile){ try{ BufferedImageqrcode=createQRCode(data,charset,hint,width,height); BufferedImagelogo=ImageIO.read(logoFile); BufferedImagecombined=newBufferedImage(height,width,BufferedImage.TYPE_INT_ARGB); Graphics2Dg=(Graphics2D)combined.getGraphics(); //设置二维码大小,太大,会覆盖二维码,此处20% intlogoWidth=logo.getWidth()>qrcode.getWidth()*2/10?(qrcode.getWidth()*2/10):logo.getWidth(); intlogoHeight=logo.getHeight()>qrcode.getHeight()*2/10?(qrcode.getHeight()*2/10):logo.getHeight(); //设置logo图片放置位置--中心 intx=Math.round((qrcode.getWidth()-logoWidth)/2); inty=Math.round((qrcode.getHeight()-logoHeight)/2); g.drawImage(qrcode,0,0,null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1f)); //开始合并绘制图片 g.drawImage(logo,x,y,logoWidth,logoHeight,null); g.drawRoundRect(x,y,logoWidth,logoHeight,15,15); //logo边框大小 g.setStroke(newBasicStroke(3)); //logo边框颜色 g.setColor(Color.white); g.drawRoundRect(x,y,logoWidth,logoHeight,15,15); g.dispose(); logo.flush(); qrcode.flush(); returncombined; }catch(IOExceptione){ thrownewRuntimeException(e.getMessage(),e); }catch(Exceptione){ thrownewRuntimeException(e.getMessage(),e); } } /** *Returnbase64forimage * *@paramimage *@return *@authorstefli */ publicstaticStringgetImageBase64String(BufferedImageimage){ Stringresult=null; try{ ByteArrayOutputStreamos=newByteArrayOutputStream(); OutputStreamb64=newBase64OutputStream(os); ImageIO.write(image,"png",b64); result=os.toString("UTF-8"); }catch(UnsupportedEncodingExceptione){ thrownewRuntimeException(e.getMessage(),e); }catch(IOExceptione){ thrownewRuntimeException(e.getMessage(),e); } returnresult; } /** *Decodethebase64Imagedatatoimage * *@parambase64ImageString *@paramfile *@authorstefli */ publicstaticvoidconvertBase64StringToImage(Stringbase64ImageString,Filefile){ FileOutputStreamos; try{ Base64d=newBase64(); byte[]bs=d.decode(base64ImageString); os=newFileOutputStream(file.getAbsolutePath()); os.write(bs); os.close(); }catch(FileNotFoundExceptione){ thrownewRuntimeException(e.getMessage(),e); }catch(IOExceptione){ thrownewRuntimeException(e.getMessage(),e); }catch(Exceptione){ thrownewRuntimeException(e.getMessage(),e); } } }
importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics2D; importjava.awt.image.BufferedImage; importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.util.Arrays; importjava.util.Date; importjava.util.HashMap; importjava.util.Map; importjavax.imageio.ImageIO; importorg.apache.commons.codec.binary.Base64; importorg.apache.commons.io.IOUtils; importorg.apache.commons.lang.StringUtils; importcom.google.zxing.BarcodeFormat; importcom.google.zxing.BinaryBitmap; importcom.google.zxing.DecodeHintType; importcom.google.zxing.EncodeHintType; importcom.google.zxing.LuminanceSource; importcom.google.zxing.MultiFormatReader; importcom.google.zxing.MultiFormatWriter; importcom.google.zxing.Result; importcom.google.zxing.WriterException; importcom.google.zxing.client.j2se.BufferedImageLuminanceSource; importcom.google.zxing.client.j2se.MatrixToImageConfig; importcom.google.zxing.common.BitMatrix; importcom.google.zxing.common.HybridBinarizer; importcom.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** *ZXing二维码生成/解码 */ publicclassZXingCode{ publicstaticvoidmain(String[]args)throwsWriterException{ try{ StringlogoPath="F:/logo.jpg"; Stringlogo_savePath="F:/"+newDate().getTime()+".png"; Stringstr=toQRCode("http://blog.csdn.net/phil_jing",logoPath,logo_savePath,"CSDN博客"); System.out.println("finishedzxingQRcodeencode."); System.out.println(Arrays.toString(Base64.decodeBase64(str))); }catch(Exceptione){ e.printStackTrace(); } } /** *生成二维码图片 *@paramcontent *@paramlogoPath *@paramsavePath *@paramremark *@return */ publicstaticStringtoQRCode(Stringcontent,StringlogoPath,StringsavePath,Stringremark){ intwidth=400,height=400; try{ BufferedImagebim=toBufferedImage(content,BarcodeFormat.QR_CODE,width,height,toDecodeHintType()); returnencode(bim,logoPath,savePath,newLogoConfig(),remark); }catch(Exceptione){ e.printStackTrace(); } returnnull; } /** *是否需要给二维码图片添加Logo *@parambim *@paramlogoPath *@paramsavePath *@paramlogoConfig *@paramremark *@return */ privatestaticStringencode(BufferedImagebim,StringlogoPath,StringsavePath,LogoConfiglogoConfig,Stringremark){ ByteArrayOutputStreambaos=null; try{ /** *读取二维码图片 */ BufferedImageimage=bim; if(StringUtils.isBlank(logoPath)){//不需要添加logo baos=newByteArrayOutputStream(); baos.flush(); ImageIO.write(image,"png",baos);//流输出 //ImageIO.write(bim,"png",newFile(savePath));//直接写入某路径,本地测试加上 returnBase64.encodeBase64URLSafeString(baos.toByteArray());//EncodesbinarydatausingaURL-safevariationofthebase64algorithm } /** *构建绘图对象 */ Graphics2Dg=image.createGraphics(); /** *读取Logo图片 */ BufferedImagelogo=ImageIO.read(newFile(logoPath)); /** *设置logo的大小,设置为二维码图片的20%,因为过大会盖掉二维码 */ intwidthLogo=logo.getWidth(null)>image.getWidth()*3/10?(image.getWidth()*3/10) :logo.getWidth(null), heightLogo=logo.getHeight(null)>image.getHeight()*3/10?(image.getHeight()*3/10) :logo.getWidth(null); /** *logo放在中心 */ intx=(image.getWidth()-widthLogo)/2; inty=(image.getHeight()-heightLogo)/2; /** *logo放在右下角intx=(image.getWidth()-widthLogo);inty=(image.getHeight()-heightLogo); */ //开始绘制图片 g.drawImage(logo,x,y,widthLogo,heightLogo,null); //g.drawRoundRect(x,y,widthLogo,heightLogo,15,15); //g.setStroke(newBasicStroke(logoConfig.getBorder())); //g.setColor(logoConfig.getBorderColor()); //g.drawRect(x,y,widthLogo,heightLogo); g.dispose(); //把备注添加上去,备注不要太长超过两行会自动截取 if(StringUtils.isNotBlank(remark)){ //新的图片,把带logo的二维码下面加上文字 BufferedImageoutImage=newBufferedImage(400,445,BufferedImage.TYPE_4BYTE_ABGR); Graphics2Doutg=outImage.createGraphics(); //画二维码到新的面板 outg.drawImage(image,0,0,image.getWidth(),image.getHeight(),null); //画文字到新的面板 outg.setColor(Color.BLACK); outg.setFont(newFont("微软雅黑",Font.BOLD,30));//字体、字型、字号 intstrWidth=outg.getFontMetrics().stringWidth(remark); if(strWidth>399){ ////长度过长就截取前面部分 //outg.drawString(productName,0,image.getHeight()+ //(outImage.getHeight()-image.getHeight())/2+5);//画文字 StringproductName1=remark.substring(0,remark.length()/2); StringproductName2=remark.substring(remark.length()/2,remark.length()); intstrWidth1=outg.getFontMetrics().stringWidth(productName1); intstrWidth2=outg.getFontMetrics().stringWidth(productName2); outg.drawString(productName1,200-strWidth1/2,image.getHeight()+(outImage.getHeight()-image.getHeight())/2+12); BufferedImageoutImage2=newBufferedImage(400,485,BufferedImage.TYPE_4BYTE_ABGR); Graphics2Doutg2=outImage2.createGraphics(); outg2.drawImage(outImage,0,0,outImage.getWidth(),outImage.getHeight(),null); outg2.setColor(Color.BLACK); outg2.setFont(newFont("微软雅黑",Font.BOLD,30));//字体、字型、字号 outg2.drawString(productName2,200-strWidth2/2,outImage.getHeight()+(outImage2.getHeight()-outImage.getHeight())/2+5); outg2.dispose(); outImage2.flush(); outImage=outImage2; }else{ outg.drawString(remark,200-strWidth/2,image.getHeight()+(outImage.getHeight()-image.getHeight())/2+12);//画文字 } outg.dispose(); outImage.flush(); image=outImage; } logo.flush(); image.flush(); baos=newByteArrayOutputStream(); baos.flush(); ImageIO.write(image,"png",baos);//不用MatrixToImageWriter //ImageIO.write(image,"png",newFile(savePath));//直接写入某路径 returnBase64.encodeBase64URLSafeString(baos.toByteArray()); }catch(Exceptione){ e.printStackTrace(); }finally{ IOUtils.closeQuietly(baos); } returnnull; } /** *生成二维码bufferedImage图片 *@paramcontent编码内容 *@parambarcodeFormat编码类型 *@paramwidth图片宽度 *@paramheight图片高度 *@paramhints设置参数 *@return */ privatestaticBufferedImagetoBufferedImage(Stringcontent,BarcodeFormatbarcodeFormat,intwidth,intheight, Maphints){ MultiFormatWritermultiFormatWriter=null; BitMatrixbitMatrix=null; BufferedImageimage=null; try{ multiFormatWriter=newMultiFormatWriter(); //参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数 bitMatrix=multiFormatWriter.encode(content,barcodeFormat,width,height,hints); intw=bitMatrix.getWidth(); inth=bitMatrix.getHeight(); image=newBufferedImage(w,h,BufferedImage.TYPE_INT_RGB); //开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色 for(intx=0;x toDecodeHintType(){ //用于设置QR二维码参数 Map hints=newHashMap (); //设置QR二维码的纠错级别(H为最高级别)具体级别信息 hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H); //设置编码方式 hints.put(EncodeHintType.CHARACTER_SET,"UTF-8"); hints.put(EncodeHintType.MARGIN,0); //hints.put(EncodeHintType.MAX_SIZE,350);//OnlyapplicabletoDataMatrixnow //hints.put(EncodeHintType.MIN_SIZE,100);//OnlyapplicabletoDataMatrixnow returnhints; } /** *二维码解码 * *@paramimgPath *@return */ publicstaticStringdecode(StringimgPath){ BufferedImageimage=null; Resultresult=null; try{ Filefile=newFile(imgPath); image=ImageIO.read(file); if(image==null){ System.out.println("thedecodeimagemaybenotexit."); } LuminanceSourcesource=newBufferedImageLuminanceSource(image); BinaryBitmapbitmap=newBinaryBitmap(newHybridBinarizer(source)); Map hints=newHashMap (); hints.put(DecodeHintType.CHARACTER_SET,"UTF-8"); result=newMultiFormatReader().decode(bitmap,hints); returnresult.getText(); }catch(Exceptione){ e.printStackTrace(); } returnnull; } } /** *Logo图片配置 */ classLogoConfig{ //logo默认边框颜色 publicstaticfinalColorDEFAULT_BORDERCOLOR=Color.WHITE; //logo默认边框宽度 publicstaticfinalintDEFAULT_BORDER=2; //logo大小默认为照片的1/5 publicstaticfinalintDEFAULT_LOGOPART=5; privatefinalintborder=DEFAULT_BORDER; privatefinalColorborderColor; privatefinalintlogoPart; /** *Createsadefaultconfigwithoncolor{@link#BLACK}andoffcolor *{@link#WHITE},generatingnormalblack-on-whitebarcodes. */ publicLogoConfig(){ this(DEFAULT_BORDERCOLOR,DEFAULT_LOGOPART); } publicLogoConfig(ColorborderColor,intlogoPart){ this.borderColor=borderColor; this.logoPart=logoPart; } publicColorgetBorderColor(){ returnborderColor; } publicintgetBorder(){ returnborder; } publicintgetLogoPart(){ returnlogoPart; } }
生成条形码
importjava.awt.image.BufferedImage; importjava.io.File; importjavax.imageio.ImageIO; importcom.google.zxing.BarcodeFormat; importcom.google.zxing.BinaryBitmap; importcom.google.zxing.LuminanceSource; importcom.google.zxing.MultiFormatReader; importcom.google.zxing.MultiFormatWriter; importcom.google.zxing.Result; importcom.google.zxing.client.j2se.BufferedImageLuminanceSource; importcom.google.zxing.client.j2se.MatrixToImageWriter; importcom.google.zxing.common.BitMatrix; importcom.google.zxing.common.HybridBinarizer; /** *ZXing条形码编码/解码 */ publicclassZxingCode{ /** *条形码编码 * *@paramcontents *@paramwidth *@paramheight *@paramimgPath */ publicstaticvoidencode(Stringcontents,intwidth,intheight,StringimgPath){ intcodeWidth=3+//startguard (7*6)+//leftbars +//middleguard (7*6)+//rightbars 3;//endguard codeWidth=Math.max(codeWidth,width); try{ BitMatrixbitMatrix=newMultiFormatWriter().encode(contents,BarcodeFormat.EAN_13,codeWidth,height,null); MatrixToImageWriter.writeToFile(bitMatrix,"png",newFile(imgPath)); }catch(Exceptione){ e.printStackTrace(); } } /** *条形码解码 * *@paramimgPath *@returnString */ publicstaticStringdecode(StringimgPath){ BufferedImageimage=null; Resultresult=null; try{ image=ImageIO.read(newFile(imgPath)); if(image==null){ System.out.println("thedecodeimagemaybenotexit."); } LuminanceSourcesource=newBufferedImageLuminanceSource(image); BinaryBitmapbitmap=newBinaryBitmap(newHybridBinarizer(source)); result=newMultiFormatReader().decode(bitmap,null); returnresult.getText(); }catch(Exceptione){ e.printStackTrace(); } returnnull; } /** *@paramargs */ publicstaticvoidmain(String[]args){ StringimgPath="F:/zxing_EAN-13.png"; Stringcontents="6926557300360"; intwidth=105,height=50; encode(contents,width,height,imgPath); System.out.println("finishedzxingEAN-13encode."); StringdecodeContent=decode(imgPath); System.out.println("解码内容如下:"+decodeContent); System.out.println("finishedzxingEAN-13decode."); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。