场景:将一个头像、二维码、文字信息添加到一张背景图片中,将这些信息合成一张图片。

代码已经测试验证。代码中图片自己随意找几张测试即可。

代码:

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder; import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.*; /**
* @Author : guoyanan
* @Title : 图片处理工具类
* @Time : 2019/03/25 16:59
* @Document : 提供在元素图片中,添加文字和添加图片的功能,图片支持椭圆形显示
*/
public class ImageUtils {
// 初始化当前类
private static ImageUtils imageUtils = new ImageUtils();
// Image 工具类
private Graphics2D graphics2D = null;
// 原始图片
private BufferedImage bufferedImage = null; /**
* 懒汉单例模式
* @return
*/
public static ImageUtils getInstance(){
return imageUtils;
} /**
* 基础图片初始化,传入作为背景图片的的路径
* @param imageUrl
* @return
* @throws IOException
*/
public Graphics2D getGraphics2DBaseImage(String imageUrl) throws IOException {
InputStream inputStream = new FileInputStream(imageUrl);
bufferedImage = ImageIO.read(inputStream);
if (inputStream != null) {
inputStream.close();
graphics2D = bufferedImage.createGraphics(); }
return graphics2D;
} /**
* 在图片中添加文字内容
* @param content
* @param color
* @param font
* @param x
* @param y
*/
public void setString(String content, Color color, Font font, Integer x, Integer y){
// 图片的默认设置
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 设置字体的颜色
graphics2D.setColor(color);
// 设置字体、字体大小、字体效果(倾斜,底线等)
graphics2D.setFont(font);
// 设置字体显示的内容和位置
graphics2D.drawString(content, x, y);
} /**
* 处理要合并的图片,支持图片椭圆行处理
* @param imageUrl
* @param x
* @param y
* @param isEllipse
* @throws IOException
*/
public void setImageLocalShape(String imageUrl, Integer x, Integer y, boolean isEllipse)throws IOException{
// 需要处理的图片
InputStream inputStreamIcon = new FileInputStream(imageUrl);
BufferedImage bufferedImageIcon = ImageIO.read(inputStreamIcon);
if (inputStreamIcon != null) {
inputStreamIcon.close();
}
// 判断是否作椭圆处理
if(isEllipse) {
/**
* 在处理合并图片形状时,一定要重新获取下原始图片的Graphics2D类,否则,会出现
* 多个图片情况下只能有一个图片合并成功,其他图片不显示的情况
* 原因: 实例引用覆盖导致的。调用clip()方法会将原先的图片覆盖导致只处理当前图片的情况
*/
Graphics2D graphics2DEll = bufferedImage.createGraphics();
// 将图片处理为圆形
Ellipse2D.Double shape = new Ellipse2D.Double(x, y, bufferedImageIcon.getWidth(), bufferedImageIcon.getHeight());
graphics2DEll.clip(shape);
graphics2DEll.drawImage(bufferedImageIcon, x, y, null);
}else {
graphics2D.drawImage(bufferedImageIcon, x, y, null);
} } /**
* 处理图片的位置和大小图形
* @param imageUrl
* @param x
* @param y
* @param width
* @param height
* @param isEllipse
* @throws IOException
*/
public void setImageLocalShapeSize(String imageUrl, Integer x, Integer y, Integer width, Integer height, boolean isEllipse)throws IOException{
// 需要处理的图片
InputStream inputStreamIcon = new FileInputStream(imageUrl);
BufferedImage bufferedImageIcon = ImageIO.read(inputStreamIcon);
if (inputStreamIcon != null) {
inputStreamIcon.close();
}
// 判断是否作椭圆处理
if(isEllipse) {
/**
* 在处理合并图片形状时,一定要重新获取下原始图片的Graphics2D类,否则,会出现
* 多个图片情况下只能有一个图片合并成功,其他图片不显示的情况
* 原因: 实例引用覆盖导致的。调用clip()方法会将原先的图片覆盖导致只处理当前图片的情况
*/
Graphics2D graphics2DEll = bufferedImage.createGraphics();
// 将图片处理为圆形
Ellipse2D.Double shape = new Ellipse2D.Double(x, y, bufferedImageIcon.getWidth(), bufferedImageIcon.getHeight());
graphics2DEll.clip(shape);
graphics2DEll.drawImage(bufferedImageIcon, x, y, width, height, null);
}else {
graphics2D.drawImage(bufferedImageIcon, x, y, width, height, null);
} } /**
* 目标图片生成
* @param imageUrl
* @throws IOException
*/
public void targetImage(String imageUrl) throws IOException{
// 初始化目标图片的路径
OutputStream outputStream = new FileOutputStream(imageUrl);
// 生成图片
JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(outputStream);
// 将生成图片中添加的信息处理
enc.encode(bufferedImage);
// 释放合并图片占用的资源信息
graphics2D.dispose();
} public static void main(String[] args){
// 获取工具类实例
ImageUtils imageUtils = ImageUtils.getInstance();
try {
// 设置背景图片
imageUtils.getGraphics2DBaseImage("F:\\tmp\\yqxr_back.jpg");
// 设置字体
Color color=new Color(152,99,59);
Font font = new Font("微软雅黑", Font.PLAIN, 20);// 添加字体的属性设置
String str = "我对你的爱是真的。"; imageUtils.setString(str,color,font,175,790); // 设置头像
imageUtils.setImageLocalShapeSize("F:\\tmp\\pic.png",310, 635,120,120,true);
// 二维码
imageUtils.setImageLocalShapeSize("F:\\tmp\\timg.jpg",230, 810,305,307,false);
// 图标
imageUtils.setImageLocalShape("F:\\tmp\\icon.png",340, 920,false);
// 生成图片
imageUtils.targetImage("F:\\tmp\\target100.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}

Image合并添加文字内容的更多相关文章

  1. 解决UEditor编辑时,只添加视频内容,不添加文字,视频信息不能保存到数据库的问题

    造成这个问题的原因是富文本保存内容时会筛除空标签,然后统计是否有内容,通过字数统计也可以看到,上传完视频后字数还是零,因为视频上传后是<video></video>标签,这个标 ...

  2. 三种方法为QLineEdit添加清除内容按钮

    很多时候我们会发现输入的一长串内容不得不全部删除重新输入,这时比起一直按着退格键不放一个清除内容按钮更受欢迎. 今天我将介绍三种为QLineEdit添加清除内容按钮的方法,其中两种方法有较强的功能针对 ...

  3. UITextView 点击添加文字 光标处于最后方

    #import "ViewController.h" @interface ViewController ()<UITextViewDelegate> @end @im ...

  4. C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9

    视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...

  5. php 图片添加文字水印 以及 图片合成(微信快码传播)

    1.图片添加文字水印: $bigImgPath = 'backgroud.png'; $img = imagecreatefromstring(file_get_contents($bigImgPat ...

  6. OpenXml入门----给Word文档添加文字

    使用OpenXml给word文档添加文字,每个模块都有自己对于的属性以及内容,要设置样式就先声明属性对象,将样式Append到属性里面,再将属性append到模块里面,那么模块里面的内容就具备该样式了 ...

  7. R语言 如何为图片添加文字说明(转载)

    转载:(中文翻译者)[http://blog.csdn.net/chen790646223/article/details/49766659] (原文链接)[http://datascienceplu ...

  8. 利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现

    1: 面向过程的编写方法 //指定图片路径 $src = '001.png'; //获取图片信息 $info = getimagesize($src); //获取图片扩展名 $type = image ...

  9. iOS 让UIButton根据文字内容自动计算宽高

    Xcode自带的UIButton控件是没有办法根据文字内容计算自身的宽和高的,下面演示一下问题, 我用代码方式创建一个UIButton,并且设置了一些属性,下面看一下效果图 一切都是这么的美好,跟我们 ...

随机推荐

  1. ZOJ 3490 String Successor(模拟)

    Time Limit: 2 Seconds Memory Limit: 65536 KB The successor to a string can be calculated by applying ...

  2. Oracle数据库设计第三范式

    一.数据库设计范式及其意义和不足 数据库的设计范式是数据库设计所需要满足的规范,数据库的规范化是优化表的结构和优化把数据组织到表中的方式,这样使数据更明确,更简洁.实践中,通常把一个数据库分成两个或多 ...

  3. 用express创建网站出现"$ DEBUG=microbog ./bin/www"的提示

    第一次用express框架创建网站,指令为:“express -t ejs microblog”,如下图 指令运行完成后,出现如图框中的提示,不知道什么意思,运行:“node app.js”来启动服务 ...

  4. 下载tree命令的源代码 - The Tree Command for Linux Homepage

    The Tree Command for Linux Homepage http://mama.indstate.edu/users/ice/tree/ [root@test ~]# ll -as m ...

  5. java 字符串解析为json 使用org.json包的JSONObject+JSONArray

    参考: https://blog.csdn.net/xingfei_work/article/details/76572550 java中四种json解析方式 JSONObject+JSONArray ...

  6. pycharm调试

    pycharm调试 flask app调试: 1.打开edit configurations面板 run===>edit configurations(图一或图二处都可以) 2.配置项目信息 点 ...

  7. 我的Android进阶之旅------>Android studio 如何修改工程的包名

    关于用Android Studio修改Android APP的应用包名的问题,今天遇到了一个坑,这里记录一下. 这里用一个简单的Demo来展示在Android Studio中如何修改Android P ...

  8. Android主页导航:fragment+viewpager

    简单实现Fragment+ViewPager实现主页导航控制,效果如下: 一.activity_main.xml布局文件: <?xml version="1.0" encod ...

  9. 编程算法 - 全然背包问题 代码(C)

    全然背包问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求 ...

  10. Thinkphp的list_to_tree 实现无限级分类列出全部节点

    list_to_tree 使用起来十分方便,具体可查看手冊.由于我在用的时候须要同一时候列出全部节点,所以写了一个递归函数,拿出来供大家參考. public function index(){ Loa ...