功能介绍:通过Graphics2D在一张背景图上添加文字描述和图片。
合成效果示意图:

代码示例:
在代码中对每步操作做了详细的注释

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;import javax.imageio.ImageIO;
import javax.swing.JLabel;import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.sinolife.sf.store.SFFile;
import com.sinolife.sf.store.TempFileFactory;public class DrawImgtest{private static final Logger logger = LoggerFactory.getLogger(DrawImgtest.class);private static TempFileFactory temFileFactory = TempFileFactory.getInstance(DrawImgtest.class);public static final String realPath = "C:\\Users\\yyyL\\Desktop\\合成\\";public static final String backgroundImage = "background.png"; // 背景图片public static final String qrCode = "qrCode.png"; // 二维码图片public static final String card = "card-big-8.png"; // 插入的小卡片private static String userId="121212122";public static void main(String[] args) throws Exception {Map<String, String> imageInfo1 = new HashMap<String, String>();imageInfo1.put("img", card);imageInfo1.put("desc", "小图上面的描述");ByteArrayOutputStream outStream = compose(imageInfo1);// TODO 保存生成的新图片File outputfile = new File(realPath+"合成.png");if (!outputfile.getParentFile().exists()) {outputfile.getParentFile().mkdirs();}FileOutputStream fs = new FileOutputStream(outputfile);fs.write(outStream.toByteArray());fs.flush();fs.close();FileOutputStream out = null;try {// 将文件临时保存SFFile tempFile = temFileFactory.createTempFile();out = tempFile.openOutputStream();byte[] b = outStream.toByteArray();out.write(b);out.flush();// TODO 后面可以通过 tempFile进行文件上传啥的} catch (Exception e) {try {if (outStream != null) {outStream.close();}if (out != null) {out.close();}} catch (IOException e1) {e1.printStackTrace();}}}private static ByteArrayOutputStream compose(Map<String,String> imageInfo1) {OutputStream out = null;try {// 加载背景图片BufferedImage imageLocal = ImageIO.read(new File(realPath+backgroundImage));int backgroundWidth = imageLocal.getWidth();int backgroundHeight = imageLocal.getHeight();addText(imageLocal, "1张贺岁卡", new Font("微软雅黑", Font.PLAIN, 35),new Color(238, 65, 53),backgroundWidth,250);// 待插入卡片图片BufferedImage image1 = ImageIO.read(new File(realPath+imageInfo1.get("img")));addText(image1, imageInfo1.get("desc"), new Font("微软雅黑", Font.PLAIN, 48),new Color(252, 219, 179),image1.getWidth(),70);// 待插入二维码  190 200BufferedImage qrCodeImg = ImageIO.read(new File(realPath+qrCode));// 以背景图片为模板Graphics2D g2d = imageLocal.createGraphics();// 这里必须要先压缩小图大小,然后再合成,不压缩直接合成会造成小图不清晰image1 = disposeImage(image1, 410, 550);// TODO 输出小图File outputfile1 = new File(realPath+"小图.png");if (!outputfile1.getParentFile().exists()) {outputfile1.getParentFile().mkdirs();}ImageIO.write(image1, "png", outputfile1);// 将小图绘画在背景图片上,生成新图片, drawImage方法参数的x和y:绘制点距离左边距和上边距的像素。 width和height:表示绘制的小图的大小g2d.drawImage(image1, (backgroundWidth - 410)/2, (backgroundHeight - 550)/2-90, 410, 550, null);g2d.drawImage(qrCodeImg, (backgroundWidth - 150)/2, backgroundHeight-260, 150, 150, null);g2d.dispose();// 生成的新图片写入文件流ByteArrayOutputStream outStream = new ByteArrayOutputStream();ImageIO.write(imageLocal, "png", outStream);return outStream;} catch (Exception e) {logger.error("DrawImgtest compose Exception: userId={}", userId, e);} finally {if (out != null) {try {out.close();} catch (IOException e) {}}}return null;}/*** 压缩图片大小* @param src* @param newWidth 新图片的宽度* @param newHeight 新图片的高度* @return* @date 2021年11月23日*/private static BufferedImage disposeImage(BufferedImage image, int newWidth, int newHeight) {// 得到源图长BufferedImage newImg = null;// 判断输入图片的类型switch (image.getType()) {case 13:newImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_4BYTE_ABGR);break;default:newImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);break;}Graphics2D g = newImg.createGraphics();g.drawImage(image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);g.dispose();return newImg;}/*** 渲染文字* @param image1* @param text* @param font* @param color* @param width* @param height* @date 2021年12月15日*/private static void addText(BufferedImage image1,String text,Font font,Color color, int width, int height) {if(StringUtils.isBlank(text)) {return;}Graphics2D g2d = image1.createGraphics();g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);JLabel jLabel = new JLabel();FontMetrics fm = jLabel.getFontMetrics(font);int textLength = fm.stringWidth(text);g2d.setFont(font);g2d.setColor(color);g2d.drawString(text, (width - textLength) / 2,height); //  设置文字的内容居中,渲染位置g2d.dispose();// 主动释放Graphics}
}

java使用Graphics2D进行图片文字合成示例相关推荐

  1. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

    文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...

  2. canvas图片文字合成(小程序分享)

    写这个的原因是在写一个小程序的需求的时候用到了,在此记录一下. 需求需要实现的点就是:在分享小程序个人资料页面的时候将个人信息和个人头像进行重叠放在一起然后分享出去,大概样子如下: 不同的用户头像不同 ...

  3. jsjq来封装一个图片文字合成图案的方法

    记录一下:封装一个图片文字合成图案的方法 这里首先做个说明 项目里使用到用canvas生成海报,在toDataURL报了这个错误Tainted canvases may not be exported ...

  4. 图像文字识别(二):java调用tesseract 识别图片文字

      在JAVA中调用tesseract识别图片的文字内容,主要有两种方式:cmd方式,tess4j方式.在这篇博客中,主要记录一下通过cmd命令行的方式.cmd方式,就是通过在java中调用命令行,来 ...

  5. Java 利用Graphics2D 合并图片(png格式可设置透明)

    利用Graphics2D 合并图片 效果如下: 图一图二合并成图三 tip:  需要上图的效果 frontgroud需要为png格式 附上代码: import javax.imageio.ImageI ...

  6. H5网页Canvas画布绘图 图片文字合成

    一个很简单的小列子,直接贴代码,代码中都有注释,下面有demo链接. <html> <head><meta name="viewport" conte ...

  7. canvas 图片 文字 合成

    canvas可以合成文字  图片   这样可以本地预览图片了 直接加载本地的图片:先用<img src="img/xx.jpg"> 引用,然后获取src 赋值到Imag ...

  8. java ocr linux_linux系统如何使用tess4j(java)进行ocr图片文字识别

    最近研究百度指数的采集,需要用到ocr,在网上找了很多材料,发现tesseract比较容易上手,而且可以自己训练,最重要的是,可以通过tess4j实现Java的JNA调用,如此一来,不但性能有保障,而 ...

  9. 转载_纯Java代码批量去除图片文字水印

    http://www.oicqzone.com/pc/2017062023844.html 问题 做习题的小伙伴在做试题的时候需要把Word文档中的习题切图制作成试题,由于没注意到Word转出的图片上 ...

最新文章

  1. java中setid(),Java Process.setId方法代碼示例
  2. C++实现图的深度优先遍历和广度优先遍历
  3. 字符串指针的地址的传递
  4. 超实用的JavaScript技巧及最佳实践(下)
  5. 申请苹果开发者账号(2016最新版)
  6. 配置办公室无线路由实现ip统一具体方式
  7. python网易云热歌榜歌曲信息爬取(iframe框架内数据爬取,src为空)
  8. python 2048游戏的设计_Python练习:100行代码实现一个简易的2048游戏
  9. JAVA跨考_考研人的2019——一战跨考清华计算机的血泪史
  10. 穷人靠学,富人靠抄!
  11. 如何让 Shell 提示符更酷炫
  12. 人听到坏消息的反应_如何应对坏消息,正确传达坏消息的七个方法
  13. (Java)算法基础6:图/贪心算法(带模板上考场,模板一定滚瓜烂熟解决考场订制)
  14. python网络爬虫 百度网盘_百度网盘爬虫(如何爬取百度网盘)
  15. android 客户端倍速播放,Android MediaPlayer 在 6.0 以上版本使用倍速播放功能说明
  16. redis 本地连接可以 远程连接不上问题
  17. (附源码)ssm+mysql+校园学生疫情防范监控 毕业设计281444
  18. 丰田发力研发下一代电动汽车电池
  19. Iphone死机怎么办?
  20. 网络爬虫系列笔记(3)——Beautiful Soup库

热门文章

  1. 什么是同源策略,为什么需要同源策略
  2. 滑动窗口 [搬运工、版权侵删]
  3. 孙溟㠭书画艺术《自由》
  4. 编译报错:实际参数列表和形式参数列表长度不同 解决方法
  5. 硅谷来信《西瓜与芝麻》
  6. CACL联赛第一赛季第一轮比赛排名公布!
  7. 弗罗贝尼乌斯范数 matlab,【Frobenius norm(弗罗贝尼乌斯-范数)(F-范数)】
  8. Https如何保证通信安全
  9. RationalDMIS 2020 飞行(FLY)运动(FLY motion)
  10. python:一元线性回归分析实例:时间序列分段