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和文字功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!