在工作中遇到了要把两张图片合并成一张图片的情况,具体场景是用户头像➕二维码➕背景图
本着不重复造轮子的想法,搜索了hutool的utils包,还真让我找到了一个cn.hutool.core.img.Img,以下的方法都基于此类

1. 引入依赖

        <!-- 二维码工具 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.0</version></dependency><!--hutool核心工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.8.5</version></dependency>

2. 创建自己的ImageUtil

import cn.hutool.core.img.Img;
import cn.hutool.core.io.IoUtil;
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 lombok.extern.slf4j.Slf4j;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Base64;
import java.util.Hashtable;/*** @author miao*/
@Slf4j
public class ImageUtilDemo {//定义的字体样式private final static String IMAGE_FONT = "宋体";private final static String CHARSET = "utf-8";/*** 生成正方形背景图➕头像➕二维码信息** @param background 背景图* @param avatar     头像* @param content    二维码内容信息* @param text1      文字水印1* @param text2      文字水印2* @return InputStream* @throws IOException 异常*/public static InputStream getInputStreamById(String background, String avatar,String content, String text1, String text2) throws IOException {//背景图和头像的,可以from多种格式,比如InputStream、File、Path等等Img backgroundImg = Img.from(new URL(background));Img avatarImg = Img.from(new URL(avatar));//背景图缩放大小,因为我们要正方形展示背景图,所以选择最小的边长缩放int backgroundScale =Math.min(backgroundImg.getImg().getHeight(null), backgroundImg.getImg().getWidth(null));backgroundImg.scale(backgroundScale, backgroundScale);//二维码BufferedImage contentImage = createImage(content);Img qr = Img.from(contentImage);//二维码缩放大小int qrScale = backgroundScale * 3 / 4;qr.scale(qrScale, qrScale);//用户头像缩放大小,方便嵌套二维码中int avatarScale = qrScale / 4;avatarImg.scale(avatarScale, avatarScale);//文字大小Font f = new Font(IMAGE_FONT, Font.PLAIN, 20);//文字上下偏移量int y = (backgroundScale + qrScale) / 4;//背景+二维码+头像+文字backgroundImg.pressImage(qr.getImg(), 0, 0, 1).pressImage(avatarImg.getImg(), 0, 0, 1)//因为文字是底部偏移的,所以我微调了一下y轴.pressText(text1, Color.white, f, 0, -y + 20, 1).pressText(text2, Color.white, f, 0, y + 20, 1);//创建一个ByteArrayOutputStreamByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write((RenderedImage) backgroundImg.getImg(), "PNG", os);//ByteArrayOutputStream转成InputStreamreturn new ByteArrayInputStream(os.toByteArray());}/*** 内容生成生成二维码** @param content 扫描成功的内容* @return 二维码图片*/private static BufferedImage createImage(String content) {//等同于hashmap,hashtable是线程安全的Hashtable<EncodeHintType, Object> hints = new Hashtable<>();//高容错率二维码hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix;try {bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 250, 250, hints);} catch (WriterException e) {log.info("生成二维码信息异常,请稍后重试");throw new RuntimeException("The generated QR code information is abnormal, please try again later");}int width = bitMatrix.getWidth();int height = bitMatrix.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, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}//直接返回生成的二维码return image;}public static void main(String[] args) throws Exception {InputStream in = getInputStreamById("https://cdn.nlark.com/yuque/0/2023/jpeg/437634/1678363983015-a1704c08-722b-4d5a-856f-95e80de27c32.jpeg","https://cdn.nlark.com/yuque/0/2023/png/437634/1678364047500-2e92eed3-0e12-42b4-8ae6-cdd65cd8e211.png?x-oss-process=image%2Fresize%2Cw_350%2Climit_0","两张图片合并且附带二维码和文字水印测试","我真有起床气", "不定时更新文章");String uriPrefix = "data:image/jpeg;base64,";String str = uriPrefix + imageToBase64(in);System.out.println(str);}/*** base64展示,可以直接在线显示合并内容* 网址:https://tool.chinaz.com/tools/imgtobase** @param in InputStream* @return String*/public static String imageToBase64(InputStream in) {try {byte[] data = IoUtil.readBytes(in);return Base64.getEncoder().encodeToString(data);} catch (Exception e) {e.printStackTrace();}return null;}
}

3. 结果


4. 写在最后的话

关于具体缩放比例和偏移量,同学们可以通过自己的业务来制定,还有生成Inputstream无论是保存数据库还是上传到服务器都很方便!!
那我们就下次文章再见吧

Java,图片添加二维码和文字水印,合并为一张图相关推荐

  1. Java 生成微信扫描的二维码,跳转到指定网址,图片增加二维码及文字水印

    两种场景: 1.图片海报中加二维码 2.二维码中间加入指定图标 注意点:字体要再设置一下清晰度,要不特别模糊. graph.setRenderingHint(RenderingHints.KEY_TE ...

  2. php两张图片动态合成thinkphp实现二维码及文字水印合并拼接到背景图上

    实现场景: 1,本站注册的推广分销人员需要有自己的独有邀请码,这个邀请码需要转换成二维码,并让推广员保存在手机相册中,分发到其它群中,进行二维码图片推广 2,但是单独二维码过于简陋, 不够吸引眼球.需 ...

  3. 图片添加二维码水印教程

    本博客介绍一下用jdk awt实现图片加文字水印和图片水印的方法 一.图片文字水印 import java.awt.AlphaComposite; import java.awt.Color; imp ...

  4. 微信小程序实现蓝牙打印(图片、二维码、文字)

    小程序连接蓝牙打印机实现打印功能 这真是一块超级难啃的骨头,我也是参考了很多文章才勉强理解,但是如果你啃动了,那你以后也有了拿得出手的资本了 完整DEMO地址可直接下载下来使用 搜索与连接蓝牙,这个我 ...

  5. 海报图片添加二维码图

    上图 455*651 灰色区域:left 200; top 200; width 200; height 200;$config = array('image' => array(array(' ...

  6. java生成二维码 推广海报添加二维码 文字水印 二维码添加LOGO

    前言 场景: 一.推广海报贴上二维码,用户扫码跳转             二.二维码中间贴logo   eg:这里使用展示第一种场景 一.使用工具 Google开源项目ZXing(二维条码编解码). ...

  7. Java实现二维码和文字合成一张新图片

    很久没来写文章了,自己忙又懒.最近实现了一个需求,有点意思,就想起来记录一下. 业务需求:生成一个二维码,旁边还要加点解释说明什么的,(类似)最终效果如下 一.实现思路 1.二维码生成:使用hutoo ...

  8. JAVA生成的二维码以及给二维码添加背景图片

    JAVA生成的二维码以及给二维码添加背景图片** 1.页面只需一行代码即可(用ajax请求得不到响应,也可以用表单提交) window.location.href = "${ctx}/qrc ...

  9. java在底图上生成二维码以及文字

    java在底图上生成二维码以及文字 1.添加依赖 <dependency><groupId>cn.hutool</groupId><artifactId> ...

最新文章

  1. 【BZOJ 4016】[FJOI2014]最短路径树问题
  2. python爬去百度搜索结果_python实现提取百度搜索结果的方法
  3. 页面的缓存与不缓存设置
  4. 【连载】如何掌握openGauss数据库核心技术?秘诀二:拿捏执行器技术(1)
  5. TF-layers.MaxPooling1D
  6. [233]树莓派裸机代码bootloader学习总结
  7. java编写计算器的原理_Java语言开发的计算器的心得
  8. java 统计库_几个可用于数据挖掘和统计分析的java库
  9. CAD二次开发(VB)代码整理
  10. Python并发编程
  11. Android RSA加密解密
  12. SAP Hybris培训-标准课程/企业内训
  13. 一文看懂RPA的技术原理、产品形态、设计与构建
  14. idea中使用git和svn
  15. 信号与系统1-关于卷积的那些事
  16. html5经纬度定位 源码_基于浏览器的HTML5地理定位
  17. MAC下基于XAMPP套件安装xdebug扩展
  18. STM32H743开发板移植micropython并外扩32M的SQPI flash和32M的SDRAM
  19. 大数据处理过程的通俗理解
  20. 同行者语音助手_车载语音搭载率接近八成,“后价格战”时代的错位竞争GGAI头条...

热门文章

  1. 实战篇-OpenSSL之AES加密算法-CFB8模式
  2. ubuntu删除文件(夹)命令
  3. nf_conntrack
  4. 文字竖排列,Java基础语法实例之我的名字
  5. UltraEdit 文件标签 显示
  6. lstm bptt推导
  7. 中文编程,最精致的python访客登记系统实例项目,微信机器人不再只当人工智障------06
  8. 教育论文发表《新课程》是什么级别?
  9. python - 截取指定帧数间隔的视频,并保存图片到指定位置
  10. java中引用jgit_JAVA使用jgit编写的git客户端