最近刚好在做一个基于二维码的电子优惠券,便弄了一个生成Logo的二维码工具类。

package com.left.QrCode;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.codec.binary.Base64;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @Description: (二维码)*/
public class ZXingCode {private static final int QRCOLOR = 0xFF000000;   //默认是黑色private static final int BGWHITE = 0xFFFFFFFF;   //背景颜色public static void main(String[] args) throws WriterException {try {getLogoQRCode("https://blog.csdn.net/weixin_37591536","E:/qrcode/1.png", "跳转到程程博客的二维码");} catch (Exception e) {e.printStackTrace();}}/*** 生成带logo的二维码图片** @param qrUrl* @param ,*/public static String getLogoQRCode(String qrUrl, String logUrl,String productName) {
//      String filePath = (javax.servlet.http.HttpServletRequest)request.getSession().getServletContext().getRealPath("/") + "resources/images/logoImages/llhlogo.png";//filePath是二维码logo的路径,但是实际中我们是放在项目的某个路径下面的,所以路径用上面的,把下面的注释就好File file = new File(logUrl);String content = qrUrl;try {ZXingCode zp = new ZXingCode();BufferedImage bim = zp.getQR_CODEBufferedImage(content, BarcodeFormat.QR_CODE, 400, 400, zp.getDecodeHintType());return zp.addLogo_QRCode(bim, file, new LogoConfig(), productName);} catch (Exception e) {e.printStackTrace();}return null;}/*** 给二维码图片添加Logo*/public String addLogo_QRCode(BufferedImage bim, File logoPic, LogoConfig logoConfig, String productName) {try {/*** 读取二维码图片,并构建绘图对象*/BufferedImage image = bim;Graphics2D g = image.createGraphics();/*** 读取Logo图片*/BufferedImage logo = ImageIO.read(logoPic);/*** 设置logo的大小,本人设置为二维码图片的20%,因为过大会盖掉二维码*/int widthLogo = 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放在中心*/int x = (image.getWidth() - widthLogo) / 2;int y = (image.getHeight() - heightLogo) / 2;/*** logo放在右下角*  int x = (image.getWidth() - widthLogo);*  int y = (image.getHeight() - heightLogo);*///开始绘制图片g.drawImage(logo, x, y, widthLogo, heightLogo, null);
//            g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
//            g.setStroke(new BasicStroke(logoConfig.getBorder()));
//            g.setColor(logoConfig.getBorderColor());
//            g.drawRect(x, y, widthLogo, heightLogo);g.dispose();//把商品名称添加上去,商品名称不要太长哦,这里最多支持两行。太长就会自动截取啦if (productName != null && !productName.equals("")) {//新的图片,把带logo的二维码下面加上文字BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);Graphics2D outg = outImage.createGraphics();//画二维码到新的面板outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);//画文字到新的面板outg.setColor(Color.BLACK);outg.setFont(new Font("宋体", Font.BOLD, 30)); //字体、字型、字号int strWidth = outg.getFontMetrics().stringWidth(productName);if (strWidth > 399) {
//                  //长度过长就截取前面部分
//                  outg.drawString(productName, 0, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 5 ); //画文字//长度过长就换行String productName1 = productName.substring(0, productName.length() / 2);String productName2 = productName.substring(productName.length() / 2, productName.length());int strWidth1 = outg.getFontMetrics().stringWidth(productName1);int strWidth2 = outg.getFontMetrics().stringWidth(productName2);outg.drawString(productName1, 200 - strWidth1 / 2, image.getHeight() + (outImage.getHeight() - image.getHeight()) / 2 + 12);BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);Graphics2D outg2 = outImage2.createGraphics();outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);outg2.setColor(Color.BLACK);outg2.setFont(new Font("宋体", 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();ByteArrayOutputStream baos = new ByteArrayOutputStream();baos.flush();ImageIO.write(image, "png", baos);//二维码生成的路径,但是实际项目中,我们是把这生成的二维码显示到界面上的,因此下面的折行代码可以注释掉//可以看到这个方法最终返回的是这个二维码的imageBase64字符串//前端用 <img src="https://img-blog.csdnimg.cn/2022010615303214074.png"/>  其中${imageBase64QRCode}对应二维码的imageBase64字符串ImageIO.write(image, "png", new File("E:/qrcode/" + new Date().getTime() + "test.png")); //TODOString imageBase64QRCode = Base64.encodeBase64URLSafeString(baos.toByteArray());baos.close();return imageBase64QRCode;} catch (Exception e) {e.printStackTrace();}return null;}/*** 构建初始化二维码** @param bm* @return*/public BufferedImage fileToBufferedImage(BitMatrix bm) {BufferedImage image = null;try {int w = bm.getWidth(), h = bm.getHeight();image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < w; x++) {for (int y = 0; y < h; y++) {image.setRGB(x, y, bm.get(x, y) ? 0xFF000000 : 0xFFCCDDEE);}}} catch (Exception e) {e.printStackTrace();}return image;}/*** 生成二维码bufferedImage图片** @param content       编码内容* @param barcodeFormat 编码类型* @param width         图片宽度* @param height        图片高度* @param hints         设置参数* @return*/public BufferedImage getQR_CODEBufferedImage(String content, BarcodeFormat barcodeFormat, int width, int height, Map<EncodeHintType, ?> hints) {MultiFormatWriter multiFormatWriter = null;BitMatrix bm = null;BufferedImage image = null;try {multiFormatWriter = new MultiFormatWriter();// 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数bm = multiFormatWriter.encode(content, barcodeFormat, width, height, hints);int w = bm.getWidth();int h = bm.getHeight();image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);// 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色for (int x = 0; x < w; x++) {for (int y = 0; y < h; y++) {image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);}}} catch (WriterException e) {e.printStackTrace();}return image;}/*** 设置二维码的格式参数** @return*/public Map<EncodeHintType, Object> getDecodeHintType() {// 用于设置QR二维码参数Map<EncodeHintType, Object> hints = new HashMap<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);return hints;}
}class LogoConfig {// logo默认边框颜色public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;// logo默认边框宽度public static final int DEFAULT_BORDER = 2;// logo大小默认为照片的1/5public static final int DEFAULT_LOGOPART = 5;private final int border = DEFAULT_BORDER;private final Color borderColor;private final int logoPart;/*** Creates a default config with on color {@link #} and off color* {@link #}, generating normal black-on-white barcodes.*/public LogoConfig() {this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);}public LogoConfig(Color borderColor, int logoPart) {this.borderColor = borderColor;this.logoPart = logoPart;}public Color getBorderColor() {return borderColor;}public int getBorder() {return border;}public int getLogoPart() {return logoPart;}
}

JAVA生成带LOGO的二维码相关推荐

  1. zxing生成带logo的二维码

    倒Zxing依赖 implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1' 代码段 import android.graphics.Bitma ...

  2. Android Studio 生成二维码、生成带logo的二维码

    1.生成二维码: 2.生成logo的二维码: 一.引入依赖 首先在libs文件目录下放进jar包zxing.jar,要下载zxing.jar就点击链接:下载zxing.jar(记得点击"Cd ...

  3. 使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小

    使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小  * 可选是否带logo,可选是否保存二维码图片:结果返回base64编码的图片数据字符串  * 页面显示:< ...

  4. Java生成中间logo的二维码(还可以加上二维码名称哦)

    最近有负责微信开发,对于微信开发的项目,肯定少不了二维码啦,正好有个这样的需求,这对不同的商品生成一个二维码,扫码即刻下单.博主就弄了一个二维码生成的工具类. 弄出来之后,产品经理又说了,中间放上公司 ...

  5. jQuery生成带Logo的二维码

    用zxing生成二维码并解析:https://blog.csdn.net/qq_41879385/article/details/81320723 用QR Code生成和解析二维码文章地址:https ...

  6. iOS 生成带 logo 的二维码,区域截屏保存至相册(小功能二连发 (一))

    原文链接:http://www.jianshu.com/p/36e9f012ef39 生成带 logo 的二维码 区域截屏相关 -- 由3033分享 开篇 最近项目需要搞了几个相对独立的小功能,今天有 ...

  7. asp.net 后台生成二维码及生成带logo的二维码

    asp.net 后台生成二维码及生成带logo的二维码,此处将生成二维码和带Logo的二维码写在一起的,需要自己区分一下. 直接上代码 using System; using System.Colle ...

  8. vue 生成带logo的二维码 qrcode-vue 支持下载图片 实例详解

    最近的项目上有个需求,生成带logo的二维码,网上大部分都是基于JQ插件jQuery.qrcode.对于vue项目并不适用,翻阅了大量资料后,我找到了qrcode-vue这款基于vue的生成二维码的插 ...

  9. Golang使用qrcode生成二维码,以及生成带logo的二维码

    添加并引用依赖 go get github.com/boombuler/barcodeimport ("github.com/skip2/go-qrcode" ) 1.生成字节形式 ...

  10. .NET ZXING 生成带logo的二维码和普通二维码及条型码

    工作中使用到了,就随笔记下了.希望可以帮助有需要的同学们. /// <summary>         /// 生成二维码         /// </summary>     ...

最新文章

  1. WPF学习拾遗(二)TextBlock换行
  2. 解决php写入mysql乱码问题汇总
  3. 带手势划动功能的日历源码
  4. 一步步编写操作系统 38 一级页表与虚拟地址3
  5. java并查集找朋友圈_并查集求朋友圈最大人数
  6. python graphviz_Python中Graphviz的输出问题
  7. 调试sim800L模块
  8. 小学计算机表格课件,小学信息技术级轻松做表格Word表格制作PPT课件.ppt
  9. 服务器后台怎么修改网站图片,网站后台修改图片
  10. 对自然数e的理解,推导(基础)
  11. atom平台 android ia,ZTE Grand X IN:搭载Atom平台的Android机
  12. 编程学习网站 收集于网络
  13. 微信小程序关于页面不跳转的问题
  14. 量子计算机的相干特征,几乎不受损耗和退相干影响的量子态,旨在推动量子计算机发展!...
  15. php微信公众号报警,Zabbix之微信订阅号平台报警
  16. 北师大计算机在线作业9,北师大网络教育《计算机动画》在线作业-20210614020942.pdf-原创力文档...
  17. 软件测试常用linux命令
  18. cordova 插件cordova-plugin-crosswalk-webview - Android 集成crosswalk浏览器内核
  19. 服务器处理蜘蛛抓取网页的过程,搜索引擎蜘蛛抓取页面过程图解
  20. VS CODE 使用介绍

热门文章

  1. 邮件客户端里的网络设置
  2. 和领导相处的10条法则,越早知道越好
  3. 第十六届“振兴杯”计算机网络管理员赛项理论参考题库(2)多选
  4. Android 时间API
  5. 解决ubuntu系统使用vim时方向键乱跳问题
  6. 网易2016在线笔试小结
  7. windows XP下openbravo ERP 2.40安装手迹
  8. gitlab 版本升级
  9. 【转】精益看板核心实践大作战
  10. java-net-php-python-jsp无锡尚客优酒店客房管理信息系统mp4计算机毕业设计程序