Java生成二维码可添加logo和文字功能
废话不多说,直接给大家贴代码了,具体代码如下所示:
packagecom.luo.wctweb.util;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics2D;
importjava.awt.image.BufferedImage;
importjava.io.ByteArrayOutputStream;
importjava.io.File;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.Map;
importjavax.imageio.ImageIO;
importjavax.servlet.http.HttpServletRequest;
importcom.google.zxing.BarcodeFormat;
importcom.google.zxing.EncodeHintType;
importcom.google.zxing.MultiFormatWriter;
importcom.google.zxing.WriterException;
importcom.google.zxing.common.BitMatrix;
importcom.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
importcom.lz.lsf.util.Base64;
/***@Description:(二维码)*@author:luoguohui*@date:2015-10-29下午05:27:13*/
publicclassZXingCode{
privatestaticfinalintQRCOLOR=0xFF000000;//默认是黑色
privatestaticfinalintBGWHITE=0xFFFFFFFF;//背景颜色
publicstaticvoidmain(String[]args)throwsWriterException
{
try
{
getLogoQRCode("https://www.baidu.com/",null,"跳转到百度的二维码");
}
catch(Exceptione)
{
e.printStackTrace();
}
}
/***生成带logo的二维码图片**@paramqrPic*@paramlogoPic*/
publicstaticStringgetLogoQRCode(StringqrUrl,HttpServletRequestrequest,StringproductName)
{
//StringfilePath=request.getSession().getServletContext().getRealPath("/")+"resources/images/logoImages/llhlogo.png";
//filePath是二维码logo的路径,但是实际中我们是放在项目的某个路径下面的,所以路径用上面的,把下面的注释就好
StringfilePath="C:/Users/luoguohui/Desktop/78310a55b319ebc4fa3aef658126cffc1f17168f.jpg";//TODO
Stringcontent=qrUrl;
try
{
ZXingCodezp=newZXingCode();
BufferedImagebim=zp.getQR_CODEBufferedImage(content,BarcodeFormat.QR_CODE,400,400,zp.getDecodeHintType());
returnzp.addLogo_QRCode(bim,newFile(filePath),newLogoConfig(),productName);
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
/***给二维码图片添加Logo**@paramqrPic*@paramlogoPic*/
publicStringaddLogo_QRCode(BufferedImagebim,FilelogoPic,LogoConfiglogoConfig,StringproductName)
{
try
{
/***读取二维码图片,并构建绘图对象*/
BufferedImageimage=bim;
Graphics2Dg=image.createGraphics();
/***读取Logo图片*/
BufferedImagelogo=ImageIO.read(logoPic);
/***设置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(productName!=null&&!productName.equals("")){
//新的图片,把带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(productName);
if(strWidth>399){
////长度过长就截取前面部分
//outg.drawString(productName,0,image.getHeight()+(outImage.getHeight()-image.getHeight())/2+5);//画文字
//长度过长就换行
StringproductName1=productName.substring(0,productName.length()/2);
StringproductName2=productName.substring(productName.length()/2,productName.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(productName,200-strWidth/2,image.getHeight()+(outImage.getHeight()-image.getHeight())/2+12);//画文字
}
outg.dispose();
outImage.flush();
image=outImage;
}
logo.flush();
image.flush();
ByteArrayOutputStreambaos=newByteArrayOutputStream();
baos.flush();
ImageIO.write(image,"png",baos);
//二维码生成的路径,但是实际项目中,我们是把这生成的二维码显示到界面上的,因此下面的折行代码可以注释掉
//可以看到这个方法最终返回的是这个二维码的imageBase64字符串
//前端用<imgsrc="data:image/png;base64,${imageBase64QRCode}"/>其中${imageBase64QRCode}对应二维码的imageBase64字符串
ImageIO.write(image,"png",newFile("C:/Users/luoguohui/Desktop/TDC-"+newDate().getTime()+"test.png"));//TODO
StringimageBase64QRCode=Base64.byteArrayToBase64(baos.toByteArray());
baos.close();
returnimageBase64QRCode;
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
/***构建初始化二维码**@parambm*@return*/
publicBufferedImagefileToBufferedImage(BitMatrixbm)
{
BufferedImageimage=null;
try
{
intw=bm.getWidth(),h=bm.getHeight();
image=newBufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
for(intx=0;x<w;x++)
{
for(inty=0;y<h;y++)
{
image.setRGB(x,y,bm.get(x,y)?0xFF000000:0xFFCCDDEE);
}
}
}
catch(Exceptione)
{
e.printStackTrace();
}
returnimage;
}
/***生成二维码bufferedImage图片**@paramcontent*编码内容*@parambarcodeFormat*编码类型*@paramwidth*图片宽度*@paramheight*图片高度*@paramhints*设置参数*@return*/
publicBufferedImagegetQR_CODEBufferedImage(Stringcontent,BarcodeFormatbarcodeFormat,intwidth,intheight,Map<EncodeHintType,?>hints)
{
MultiFormatWritermultiFormatWriter=null;
BitMatrixbm=null;
BufferedImageimage=null;
try
{
multiFormatWriter=newMultiFormatWriter();
//参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
bm=multiFormatWriter.encode(content,barcodeFormat,width,height,hints);
intw=bm.getWidth();
inth=bm.getHeight();
image=newBufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
//开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
for(intx=0;x<w;x++)
{
for(inty=0;y<h;y++)
{
image.setRGB(x,y,bm.get(x,y)?QRCOLOR:BGWHITE);
}
}
}
catch(WriterExceptione)
{
e.printStackTrace();
}
returnimage;
}
/***设置二维码的格式参数**@return*/
publicMap<EncodeHintType,Object>getDecodeHintType()
{
//用于设置QR二维码参数
Map<EncodeHintType,Object>hints=newHashMap<EncodeHintType,Object>();
//设置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);
hints.put(EncodeHintType.MIN_SIZE,100);
returnhints;
}
}
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;
}
}
以上所述是小编给大家介绍的Java生成二维码可添加logo和文字功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!