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;xhint,
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;xtoDecodeHintType(){
//用于设置QR二维码参数
Maphints=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));
Maphints=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。