目录

  • 一、需求
  • 二、依赖导入
  • 三、ZXing生成二维码图片的工具类
  • 四、合成图片的工具类
  • 五、实践
  • 结语

一、需求

  日常中一个很常见的小需求:把一个地址做成二维码码牌,比如商户收银,关注公众号等等。其实学习了java,你也可以实现这样的功能,现在我们就一起来做一个吧。本文的事例就是把我的博客地址做成一个码牌,流程如下:

二、依赖导入

小提示:主要采用com.google.zxing的jar,如果是web应用,则core包与javase包一起导入;如果是非web应用则只导入core包即可。

项目类型 core包 javase包
web项目 导入 导入
普通Java项目 导入

具体依赖如下:

<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version>
</dependency><!--如果时web项目时导入javase-->
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version>
</dependency>

三、ZXing生成二维码图片的工具类

QRCodeUtil.java
本工具类是通过com.google.zxing来实现生成二维码的

package com.alian.csdn.utils;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.datamatrix.encoder.SymbolShapeHint;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** @program: csdn* @description: 二维码工具类* @author: Alian* @create: 2021-05-28 09:10:12**/
public class QRCodeUtil {//黑色private static final int BLACK = 0xFF000000;//白色private static final int WHITE = 0xFFFFFFFF;//编码集private static final String CHARSET = "UTF-8";/*** @param content:二维码的内容* @param width:要生成的二维码的宽度* @param height:要生成的二维码的高度* @param fileName:文件的名称* @param imageType:文件的类型* @param filePath:文件的地址*/public static String createImage(String content, int width, int height, String fileName, String imageType, String filePath) {MultiFormatWriter multiFormatWriter = new MultiFormatWriter();Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, CHARSET);//编码集hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//容错率hints.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_SQUARE);//生成的数据矩阵的形状try {BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);File file = new File(filePath, fileName + "." + imageType);bitMatrix = deleteWhite(bitMatrix);writeToFile(bitMatrix, imageType, file);return filePath + File.separator + fileName + "." + imageType;} catch (WriterException | IOException e) {e.printStackTrace();}return "";}/*** 清除白边** @param matrix* @return*/public static BitMatrix deleteWhite(BitMatrix matrix) {int[] rec = matrix.getEnclosingRectangle();int resWidth = rec[2];int resHeight = rec[3];BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);resMatrix.clear();for (int i = 0; i < resWidth; i++) {for (int j = 0; j < resHeight; j++) {if (matrix.get(i + rec[0], j + rec[1]))resMatrix.set(i, j);}}return resMatrix;}/*** 写入二维码文件* @param matrix* @param format* @param file* @throws IOException*/public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {int width = matrix.getWidth();int height = matrix.getHeight();BufferedImage 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, matrix.get(x, y) ? BLACK : WHITE);}}if (!ImageIO.write(image, format, file)) {throw new IOException("Could not write an image of format " + format + " to " + file);}}
}

四、合成图片的工具类

ImageUtil .java
本工具类是主要通过java基础组件来实现图片合成的(包含文字绘制)

package com.alian.csdn.utils;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;/*** @program: CSDN* @description: 图片合成工具* @author: Alian* @create: 2021-05-29 11:11:11**/
public class ImageUtil {/*** 一些写死的参数,一般是不会变的,各自根据自己的模板进行调整即可* @param backGroundImageUrl* @param qrCodeUrl* @param imageName* @param title* @return*/public static String merge(String backGroundImageUrl, String qrCodeUrl, String imageName, String title) {// 添加字体的属性设置Font font = new Font("黑体", Font.BOLD, 120);try {//加载背景图片(也就是模板图)BufferedImage backGroundImage = ImageIO.read(new File(backGroundImageUrl));//加载二维码图片(也就是需要合成到模板图上的图片)BufferedImage imageCode = ImageIO.read(new File(qrCodeUrl));//把背景图片当做为模板Graphics2D graphics = backGroundImage.createGraphics();//在模板上绘制图象(需要绘图的图片,左边距,上边距,图片宽度,图片高度,图像观察者)同一个模板一般是不会变的graphics.drawImage(imageCode, 644, 1596, 1100, 1100, null);//设置字体graphics.setFont(font);//设置颜色graphics.setColor(Color.BLACK);//获取字体度量(字体度量是指对于指定字号的某种字体,在度量方面的各种属性)FontMetrics fontMetrics = graphics.getFontMetrics(font);//获取字体度量的宽度int textWidth = fontMetrics.stringWidth(title);//左边距=(模板图宽度-文字宽度)/2int widthX = (backGroundImage.getWidth() - textWidth) / 2;//g.drawString(title, 820, 2850);//绘制文字(内容,左边距,上边距),同一个模板上边距一般也是不变的graphics.drawString(title, widthX, 2950);//完成模板修改graphics.dispose();//获取新文件的地址File outPutFile = new File(imageName);//生成新的合成过的用户二维码并写入新图片,指定类型为pngImageIO.write(backGroundImage, "png", outPutFile);} catch (Exception e) {e.printStackTrace();}// 返回给页面的图片地址(因为绝对路径无法访问)return imageName;}
}

五、实践

接下里我们通过上述两个工具类完成我们的小需求,具体如下:

    @Testpublic void test2() {//二维码的内容String qrCodeContent = "https://blog.csdn.net/Alian_1223";System.out.println("二维码的内容:" + qrCodeContent);//二维码要生成的路径String qrCodeImagePath = "C:\\myFile\\CSDN";//生成Alian.png的二维码图片(去除白边)String qrCodeUrl = QRCodeUtil.createImage(qrCodeContent, 300, 300, "qrCode_Alian", "png", qrCodeImagePath);System.out.println("生成的二维码地址:" + qrCodeUrl);//本地背景图片地址String backGroundUrl = "C:\\myFile\\CSDN\\background.png";System.out.println("背景图片地址:" + backGroundUrl);//最终合成图片的地址String imageName = "C:\\myFile\\CSDN\\result.png";//图片上的标签绘制String title = "嘉禾嘉宁PaPa";System.out.println("要添加的文字信息:" + title);//合成图片ImageUtil.merge(backGroundUrl, qrCodeUrl, imageName, title);System.out.println("合成图片完成:" + imageName);}

运行结果:

生成的二维码地址:C:\myFile\CSDN\alian_qrCode.png
背景图片地址:C:\myFile\CSDN\background.png
要添加的文字信息:嘉禾嘉宁PaPa
合成图片完成:C:\myFile\CSDN\result.png

在C:\myFile\CSDN目录下,我们可以看到已经合成的新的图片result.png

一个关注我博客的码牌就制作好了,感兴趣的同学也可以试试

结语

以上就是今天要讲的内容,本文针对现实场景下的码牌简单介绍了使用zxing生成二维码,同时实现了两个图片的合成及文字的绘制,如果有什么疑问,欢迎大家评论交流。如果觉得不错,可以帮忙一键三连,谢谢。

Java实现二维码生成及图片合成相关推荐

  1. nodejs 实现二维码生成及图片合成

    游戏前端需要做分享功能.生成二维码后 在指定的图片上添加二维码和邀请码 生成新的图片 如图所示 1.使用 qr-code生成二维码 /*** 根据url 地址生成 二维码*/async createQ ...

  2. Java实现二维码生成

    title: Java实现二维码生成 categories: "Java" 前言 日前生活上存在很多扫描二维码的场景,支付.加好友-等操作都需要扫描二维码,然后我就在想Java能不 ...

  3. iOS二维码生成中间带图片Logo

    iOS二维码生成中间带图片效果图: ViewController.h 1 #import <UIKit/UIKit.h> 2 @interface ViewController : UIV ...

  4. java实现二维码生成的几个方法

    java实现二维码生成的几个方法 分类: J2EE2013-06-13 20:32 10390人阅读 评论(1) 收藏 举报 1: 使用SwetakeQRCode在Java项目中生成二维码  http ...

  5. Java实现二维码生成 Google-Zxing

    本篇文章将介绍java中如何生成二维码,二维码的展示主要包括两各方面:1.直接生成图片(直接生成图片不需要web程序,maven工程即可) 2.将二维码转为字节数组,然后在web页面显示.web项目的 ...

  6. Java实现二维码生成与识别

    java实现QRCODE二维码的编码与解码实例 众所周知,爪哇,是一种神奇的编程语言,用JAVA 实现某一个功能,只是随便上网找一些对应的实现JAR包即可,于是,有了像JAR114这样专门提供给 爪哇 ...

  7. JAVA实现二维码生成加背景图

    应用场景:比如制作海报.宣传图时需要添加扫码关注的二维码 先上效果图 ( ≧▽≦ ) POM.XML <!-- 二维码生成 --><!-- https://mvnrepository ...

  8. java实现二维码生成及调用打印机打印

    在开发二维码打印的过程中走过几次弯路,所以在这里特意将其记录下来留作备忘.一开始参考其他博主写的文章,有介绍通过编写JAVA后台代码来获取本地默认打印机的驱动实现打印.BUT!这样就导致在本地开发测试 ...

  9. java实现二维码生成功能

    1.由来: 由于现在对二维码的使用比较多,正好我在项目里面也使用到了,所以写篇博客记录一下. 2.引入依赖: <dependency><groupId>com.google.z ...

  10. Java:二维码生成工具类

    java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...

最新文章

  1. firefox input 缓存
  2. Tomcat 中文乱码 设置UTF-8编码 问题解决办法
  3. 80后,天才程序员, Facebook 第一任 CTO,看看开挂的人生到底有多变态?
  4. centos7.3 编译安装 git 2.13
  5. Elasticsearch技术解析与实战(一)基础概念及环境搭建
  6. 重庆理工大学两江校区计算机学院,重庆理工大学两江校区国际项目9月开学
  7. 好分数阅卷3.0_自考通过率低?一位资深阅卷老师的自述
  8. iOS学习笔记-自己动手写RESideMenu
  9. strtus常用的一些配置
  10. PTA的非零返回原因以及解决办法
  11. (IStool)判断系统位数并打包不同的文件
  12. 学习 SpringCloud 五大组件后的总结 一
  13. 自旋锁spin_lock
  14. UOS系统应用商店提示安装失败
  15. 弱密码、未授权加固/修复建议
  16. 关于vscode新建文档代码自定义模板的设置
  17. html代码 层次选择器,CSS样式类的实例代码(导航栏、分页、层级选择器)
  18. 中国象棋总体设计 中国象棋课设02
  19. read write file
  20. 【P4】解决本地文件修改与库文件间的冲突问题

热门文章

  1. Charles使用教程
  2. csdn账号密码泄露了吗
  3. plc编程有哪些方法?
  4. yolov5-6.0 出现Arial.ttf无法下载问题解决办法
  5. 总结了一份嵌入式硬件开发的具体流程
  6. 泛微OA7.0下载7.1下载
  7. 博士德服务器帐套维护密码忘记,T+忘记账套主管、admin密码
  8. 如何下载微信支付证书(API证书)
  9. 面对最菜TI战队,OpenAI在Dota2上输的毫无还手之力
  10. Grasshopper学习手册第二版资源