Java二维码的生成以及附加Logo

生成二维码

所需依赖

生成二维码需要借助Zxing包

        <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.0</version></dependency>

实现过程

  1. 创建一个QRCodeWriter
  2. 使用QRCodeWriter的encode方法生成BitMatrix对象
  3. 下面分两种情况
    1. 如果需要转成流在页面展示或者下载,借助MatrixToImageWriter的writeToStream()方法将BitMatrix写到输出流
    2. 如果需要导出为文件,借助MatrixToImageWriter的writeToPath()方法将BitMatrix写到路径

写入到输出流

    public static byte[] getQrCodeImageForByte(String text, int width, int height) throws WriterException, IOException {//设置参数,用来处理信息中的中文问题Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);QRCodeWriter qrCodeWriter = new QRCodeWriter();//获取二维码BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height,hints);//定义输出流并将二维码写入到输出流ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);return pngOutputStream.toByteArray();}

写入到路径

    public static void getQrCodeImageForFile(String text,String filePath,int width,int height) throws WriterException, IOException {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height,hints);//将二维码写入到路径Path path = FileSystems.getDefault().getPath(filePath);MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);}

生成带logo的二维码

基本原理为将BitMatrix对象转换成BufferedImage对象,然后在该对象上进行修改

基本参数定义

    /*** 二维码尺寸**/private static final int QRCODE_SIZE = 300;/*** LOGO宽度**/private static final int WIDTH = 60;/*** LOGO高度**/private static final int HEIGHT = 60;

创建二维码

    private static BufferedImage createImage(String content) {//设置参数Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BufferedImage image = null;try {BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();//定义BufferedImage对象并将BitMatrix对象的像素一一对应image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}} catch (WriterException e) {e.printStackTrace();}return image;}

插入logo

 private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) {//对logo文件进行判断Optional.ofNullable(imgPath).orElseThrow(NullPointerException::new);File file = new File(imgPath);if (!file.exists()) {System.err.println("" + imgPath + "   该文件不存在!");return;}Image src ;try {src = ImageIO.read(new File(imgPath));} catch (IOException e) {e.printStackTrace();return;}int width = src.getWidth(null);int height = src.getHeight(null);// needCompress属性用来标识是否要对logo文件压缩if (needCompress) {if (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();// 绘制缩小后的图g.drawImage(image, 0, 0, null);g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}

将BufferedImage转成byte流

这里只展示转成byte流,如果想转成文件保存,使用ImageIO.write()方法将BufferedImage写入到File对象就可以

    private static byte[] convertBufferedImageIntoBytes(BufferedImage source) {ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();try {ImageIO.write(source, "PNG", pngOutputStream);} catch (IOException e) {e.printStackTrace();}return pngOutputStream.toByteArray();}

封装出public方法供外部类使用

    //获取带logo的二维码public static byte[] encode(String content, String imgPath, boolean needCompress) {BufferedImage image = QrCodeGeneratorDemo2.createImage(content);insertImage(image, imgPath, needCompress);return convertBufferedImageIntoBytes(image);}//只获取二维码public static byte[] encode(String content) {BufferedImage image = QrCodeGeneratorDemo2.createImage(content);return convertBufferedImageIntoBytes(image);}

测试用例

使用两个接口分别测试只获取二维码和获取带logo的二维码

@RestController
public class TestController {@GetMapping("/getCode")public ResponseEntity<byte[]> createQrCode() throws Exception {String text="只展示二维码";byte[] image = QrCodeGeneratorDemo2.encode(text);HttpHeaders responseHeaders = new HttpHeaders();responseHeaders.set("Content-Type", "image/png");return new ResponseEntity<>(image,responseHeaders, HttpStatus.OK) ;}@GetMapping("/getCodeWithLogo")public ResponseEntity<byte[]> createQrCodeWithLogo() throws Exception {// 存放在二维码中的内容String text = "展示带logo的二维码";// 嵌入二维码的图片路径String imgPath = "D:\\田园犬.png";byte[] image = QrCodeGeneratorDemo2.encode(text, imgPath, true);HttpHeaders responseHeaders = new HttpHeaders();responseHeaders.set("Content-Type", "image/png");return new ResponseEntity<>(image,responseHeaders, HttpStatus.OK) ;}
}

效果展示

只展示二维码

展示带logo的二维码

Java二维码的生成以及附加Logo相关推荐

  1. java二维码的生成工具

    java二维码的生成工具 1.导入jar包,我是用的是一个谷歌提供的 <dependency><groupId>com.google.zxing</groupId> ...

  2. java二维码编码生成并转换成流传入前端页面

    java二维码编码生成并转换成流传入前端页面 这里主要用了com.google.zxing的依赖,这个依赖主要可以完成图片叠加.二维码生成和图片加文字等功能. ①添加依赖 <dependency ...

  3. java二维码之生成与解析

    1.引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase< ...

  4. java生成二维码(链接生成二维码)

    Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...

  5. java二维码生成_如何使用 Java 生成二维码?

    精品专栏 <GitHub:中文详细注释的开源项目> 1. 下载jar包(QRCode.jar)2. maven项目手动引入jar包3. 编写实体类实现二维码的生成4. controller ...

  6. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍  这里我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream o ...

  7. java实现二维码的生成和解析包含工具类

    1.下载jar包( jdk1.7) 链接:https://pan.baidu.com/s/1LVq_zGsp_Po8V456h1TVmA 提取码:vqyd 2.工具类Utils.java packag ...

  8. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

  9. java二维码生成 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载

    java二维码生成 使用SSM框架 搭建属于自己的APP二维码合成.解析.下载 自己用java搭建一个属于自己APP二维码合成网站.我的思路是这样的: 1.用户在前台表单提交APP的IOS和Andro ...

  10. java利用core 工具实现二维码的生成与解析

    java利用core 工具实现二维码的生成与解析 简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反, ...

最新文章

  1. 如果不发论文,我们用什么证明自己的科研实力?
  2. 在 mac OS 中安装 xgboost python 包
  3. Truebine聚合监控
  4. java 求向量的均值,标准数组——向量
  5. java linux ping ip,java linux ping命令
  6. 8uftp,8uftp连接不上怎么办
  7. cad如何多选对象,12种CAD图形对象选择方法总结
  8. mac下Charles https抓包乱码,手机不能上网解决
  9. 大话设计模式之爱你一万年:第三章 创建型模式:工厂模式:我想让你坐在宝马里笑:4.工厂模式之工厂方法模式
  10. 如何在博客园首页设置卡通人物
  11. 大过 泽风大过 兑上巽下
  12. 【题解】P2916 [USACO08NOV]安慰奶牛Cheering up the Cow-C++
  13. keil错误和解决办法(1):FCARM - Output Name not specified, please check ‘Options for Target - Utilities’
  14. 使用 KubeKey 快速安装 Kubernetes 集群
  15. 前端React教程第六课 虚拟DOM
  16. StarGAN快速阅读
  17. 服务器里面增加单页网站,单页网站:搜索引擎的最爱
  18. 一个实验了解多层内网渗透
  19. 我国农村宅基地有偿退出机制构建研究
  20. 对接奇门ASCP通过该接口通知商家仓成交订单对应的物流订单信息接口

热门文章

  1. 脑语言v0.5.8 2500令【单字编程】
  2. 小学生python游戏编程_适合刚入门Python小白的趣味游戏编程
  3. 一、瞰景Smart3D软件介绍
  4. 欧姆龙NX系列PLC和工业软件的搜集资料
  5. 提升机器学习数学基础,这7本书一定要读-附pdf资源
  6. 机器学习中的数学——概率论基础知识
  7. php个人网页完整代码,个人主页php+html
  8. 用visio制作机柜服务器,visio 绘制机柜接线图 实例教程
  9. java调用hownet--jni
  10. B站(IT速成之JAVA速成班 300分钟算法面试)跟做笔记