一、效果图

二、代码示例:

1. 引入依赖

<!--谷歌提供的二维码插件--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.zxing/javase --><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.3</version></dependency>

2. 底层+图标图片


3. 创建二维码
①工具类:QRCodeUtil

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;/*** @author matx* @description:  生成二维码* @date 2022/8/1814:02*/
public class QRCodeUtil {protected final Logger logger = LoggerFactory.getLogger(this.getClass());//二维码颜色private static final int BLACK = 0xFF000000;//二维码颜色private static final int WHITE = 0xFFFFFFFF;/*** @param text    请求地址* @param width   图片长度* @param height  图片高度* @param logoPath logo路径* @param code    溯源码唯一code* @param smallLogo    最中间的logo* @param formatName 最终文件形式*/public static String createImg(String text, int width, int height,String logoPath,String code,String formatName,String smallLogo) {Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();//设置编码字符集his.put(EncodeHintType.CHARACTER_SET, "utf-8");String resultPath = "";try {//1、生成二维码BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, his);//2、获取二维码宽高int codeWidth = encode.getWidth();int codeHeight = encode.getHeight();//3、将二维码放入缓冲流BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);for (int i = 0; i < codeWidth; i++) {for (int j = 0; j < codeHeight; j++) {//4、循环将二维码内容定入图片image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);}}//设置圆角image = setClip(image, 400);
//            String fileName = filePath + code+".jpg";String fileName = code + ".jpg";//5、将二维码写入图片File outPutImage = new File(fileName);// 构建绘图对象Graphics2D g = image.createGraphics();// 读取网络Logo图片URL smallUrl = new URL(smallLogo);// 读取本地Logo图片//BufferedImage logo = ImageIO.read(new File(smallLogo));// 读取网络Logo图片BufferedImage logo = ImageIO.read(smallUrl);// 开始绘制logo图片g.drawImage(logo, image.getWidth() * 2 / 5, image.getHeight() * 2 / 5, image.getWidth() * 2 / 10, image.getHeight() * 2 / 10, null);g.dispose();logo.flush();image.flush();ImageIO.write(image, "jpg", outPutImage);System.out.println("二维码生成成功");//resultPath = filePath + code + ".jpg";resultPath = code + ".jpg";//二维码嵌入底层logoresultPath = mergeImage(logoPath, fileName, resultPath, formatName);} catch (Exception e) {e.printStackTrace();System.out.println("二维码图片生成失败");}return resultPath;}/*** 图片切圆角* @param srcImage* @param radius* @return*/public static BufferedImage setClip(BufferedImage srcImage, int radius) {int width = srcImage.getWidth();int height = srcImage.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);Graphics2D gs = image.createGraphics();gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);gs.setClip(new RoundRectangle2D.Double(0, 0, width, height, radius, radius));gs.drawImage(srcImage, 0, 0, null);gs.dispose();return image;}/*** 将二维码写入到logo文件中* @param logoPath  logo文件地址* @param qrPath    生成的二维码存放地址* @param resultPath 最终的文件地址* @param formatName 最终文件形式* @throws IOException*/public static String mergeImage(String logoPath,String qrPath,String resultPath,String formatName)throws IOException {//  读取本地文件
//        File srcImgFile = new File(logoPath);
//        Image srcImg = ImageIO.read(srcImgFile);// 读取原图片信息(logo)URL logoUrl = new URL(logoPath);//将文件对象转化为图片对象Image srcImg = ImageIO.read(logoUrl);//获取图片的宽int srcImgWidth = srcImg.getWidth(null);//获取图片的高int srcImgHeight = srcImg.getHeight(null);BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);//开始加水印   创建画笔Graphics2D g = bufImg.createGraphics();//绘制原始图片g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);// 水印文件Image srcWaterMark = ImageIO.read(new File(qrPath));//获取水印图片的宽度int widthWaterMark= srcWaterMark.getWidth(null);//获取水印图片的高度int heightWaterMark = srcWaterMark.getHeight(null);//设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));//绘制水印图片  坐标为中间位置g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,(srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);// 水印文件结束g.dispose();// 输出图片FileOutputStream outImgStream = new FileOutputStream(resultPath);ImageIO.write(bufImg, formatName, outImgStream);System.out.println("添加水印完成");outImgStream.flush();outImgStream.close();return resultPath;}public static void main(String[] args) throws IOException {String paths = "D:\\img\\yuan.png";System.out.println(paths);String text = "https://taceability.lpsrn.com.cn/prod-api/traceability/qrcode/getCodeValueByCode/?code=001001202208140120220815PD2022081600000000";createImg(text, 248, 248,paths, "001001202208140120220815PD2022081600000000", "png","D:\\img\\small.png");}
}

②接口调用

@GetMapping(value = "/createCode/{code}")public AjaxResult createQRCode(@PathVariable("code")String code){//请求地址String text = "https://rance.lpsrn.com.cn/prod-api/traceability/qrcode/getCodeValueByCode/?code="+code;AjaxResult ajaxResult = new AjaxResult();logger.info("【生成二维码接口】,请求参数:{}",code);try {String  diLogoPath = "https://n.oss-cn-beijing.aliyuncs.com/qrcode/20220824/8492a1e45f2745c384e0581317784790/logo.png";String smallPath = "https://n.oss-cn-beijing.aliyuncs.com/qrcode/20220824/16358df1a42c4191abdb6f2302e5a700/small.png";//图标在本地时使用
//            String  diLogoPath = "D:\\img\\logo.png";
//            String smallPath = "D:\\img\\small.png";String formatName = "png";String resultPath = QRCodeUtil.createImg(text,1048, 1048, diLogoPath, code,formatName,smallPath);File file = new File(resultPath);if (file == null) {return AjaxResult.error("文件内容为空");}ajaxResult.put("url", ossPath);ajaxResult.put("code",200);}catch(Exception e){logger.error("【生成二维码接口】异常信息:{}",e.getMessage());return  AjaxResult.error("系统异常");}logger.error("【生成二维码接口】响应信息:{}",JSON.toJSONString(ajaxResult));return ajaxResult;}

JAVA生成带图标的二维码(产品溯源码)相关推荐

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

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

  2. zxing生成带logo的二维码

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

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

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

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

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

  5. 微信公众号怎么生成带参数的二维码?

    每位运营过微信公众平台的野生小编都知道,微信提供给开发者的文档是很高深的,最近为了弄个带参数的二维码,同样技术小白的小编也死了不少脑细胞了,然而我终于知道官方生成带参数的二维码的方法了. 1.注意事项 ...

  6. 生成带参数的二维码接口实例

    1.生成带参数的二维码接口介绍 为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 目前有2种类型 ...

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

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

  8. 微信公众平台 生成带参数的二维码

    前言:最近一直在开发微信的东西,总结一下微信生成带参数的二维码.这个其实在参考文章的第一篇总结的非常详细,大家可以参考一下.这里总结一下微信生成带参数二维码的过程和主要开发代码. 注:本文使用Rest ...

  9. jQuery生成带Logo的二维码

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

最新文章

  1. wordpress怎么修改html,WordPress后台编辑器HTML模式界面中添加修改删除按钮
  2. 如何啃下C++这块复杂又难学的硬骨头?
  3. linux修改arena大小,教大家Resolume Arena怎么设置大屏幕的方法
  4. list中的linkedlist的用法
  5. 第16课:动手实战中文句法依存分析
  6. jenkins maven没有使用全局设置文件地址_Jenkins手把手图文教程「基于Jenkins 2.164.1」...
  7. 移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~
  8. 来到博客园 就要好好记录 分享技术
  9. 【转】Linux 移动或重命名文件/目录-mv 的10个实用例子
  10. 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告
  11. Android 11正式版发布!
  12. java语言定义一个具备栈功能的类_Java学习笔记 第二章 Java语言基础
  13. rest 网络设计开发,降低复杂性设计方案
  14. Fiddler2中文乱码问题
  15. 学业奖惩系统c语言,c语言成绩管理系统(完整).doc
  16. 啊哈算法——第一章第一节:桶排序
  17. eclipse 每次打开 提示 subversive svn connectors
  18. 去中心化身份(DID)赛道——构建Web3的社交通行证
  19. 云原生微服务架构实战精讲第八节 访问控制与更新策略
  20. OC引导安装Mac Big Sur教程

热门文章

  1. sqlserver根据DATEDIFF()函数计算年龄、月龄、天数
  2. 调用QQ客服对话聊天窗口:
  3. Android 默认应用
  4. 论文阅读:3D multi-scale, multi-task, and multi-label deep learning for prediction of lymph node metasta
  5. 虚拟键码如何在c语言里使用方法,二、Windows按键消息—虚拟键码
  6. AS5047开发简介
  7. Xshell 5 解除强制更新方法汇总(文内含密钥与下载链接)
  8. 【论文笔记】ANR: Aspect-based Neural Recommender 基于方面的神经网络推荐系统
  9. 【Java】【Enum】56个民族
  10. MapGIS K9 三维TDE平台中实体的可见与不可见