Image合并添加文字内容
场景:将一个头像、二维码、文字信息添加到一张背景图片中,将这些信息合成一张图片。
代码已经测试验证。代码中图片自己随意找几张测试即可。
代码:
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合并添加文字内容的更多相关文章
- 解决UEditor编辑时,只添加视频内容,不添加文字,视频信息不能保存到数据库的问题
造成这个问题的原因是富文本保存内容时会筛除空标签,然后统计是否有内容,通过字数统计也可以看到,上传完视频后字数还是零,因为视频上传后是<video></video>标签,这个标 ...
- 三种方法为QLineEdit添加清除内容按钮
很多时候我们会发现输入的一长串内容不得不全部删除重新输入,这时比起一直按着退格键不放一个清除内容按钮更受欢迎. 今天我将介绍三种为QLineEdit添加清除内容按钮的方法,其中两种方法有较强的功能针对 ...
- UITextView 点击添加文字 光标处于最后方
#import "ViewController.h" @interface ViewController ()<UITextViewDelegate> @end @im ...
- C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9
视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...
- php 图片添加文字水印 以及 图片合成(微信快码传播)
1.图片添加文字水印: $bigImgPath = 'backgroud.png'; $img = imagecreatefromstring(file_get_contents($bigImgPat ...
- OpenXml入门----给Word文档添加文字
使用OpenXml给word文档添加文字,每个模块都有自己对于的属性以及内容,要设置样式就先声明属性对象,将样式Append到属性里面,再将属性append到模块里面,那么模块里面的内容就具备该样式了 ...
- R语言 如何为图片添加文字说明(转载)
转载:(中文翻译者)[http://blog.csdn.net/chen790646223/article/details/49766659] (原文链接)[http://datascienceplu ...
- 利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现
1: 面向过程的编写方法 //指定图片路径 $src = '001.png'; //获取图片信息 $info = getimagesize($src); //获取图片扩展名 $type = image ...
- iOS 让UIButton根据文字内容自动计算宽高
Xcode自带的UIButton控件是没有办法根据文字内容计算自身的宽和高的,下面演示一下问题, 我用代码方式创建一个UIButton,并且设置了一些属性,下面看一下效果图 一切都是这么的美好,跟我们 ...
随机推荐
- IE强制不使用兼容模式
[caption id="attachment_471" align="alignnone" width="431"] 强制不使用兼容模式[ ...
- HTTP协议包分析(小马上传大马)
最近工作内容是分析防火墙日志,看日志是正确,本地实验小马上传大马 抓取http包如下.可以在分析过程中进行借鉴. 该http请求的行为是通过小马,在小马的当前目录创建一个dama.php的文件,文件 ...
- mysqld.sock
sudo service mysql start https://dev.mysql.com/doc/refman/5.7/en/problems-with-mysql-sock.html B.5. ...
- CCCallFunc, CCCallFuncN, CCCallFuncND 三者的区别
今天学习过程中,自己敲了一个例子,结果在执行Action的时候出现了错误.经排查发现是CCCallFunc使用的问题,应该使用CCCallFuncN,然后搜了下他们的区别,才知道,是因为有一个参数的问 ...
- WebService 综合案例
1. 需求: 集成公网手机号归属地查询服务; 对外发布自己的手机号归属地查询服务; 提供查询界面 //1. 使用 wsimport 生成公网客户端代码 // 2. 创建 SEI 接口 @WebServ ...
- 前端 CSS 边框
border 边框 solid 实体的 red 边框什么颜色 <!DOCTYPE html> <html lang="en"> <head> & ...
- 在Docker上安装配置Oracle教程
地址:https://github.com/wnameless/docker-oracle-xe-11g Docker shell 下: docker pull wnameless/oracle-xe ...
- ubuntu16.04 tomcat7安装和编码修改(转发:https://blog.csdn.net/zl544434558/article/details/76735564)
有直接通过命令安装的,但是我还是喜欢把文件下载下来,然后自己配置. 1,下载tomcat7二进制文件 https://tomcat.apache.org/download-70.cgi 2,解压tom ...
- Dora.Interception, 为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式
相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...
- Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索"
Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索" //匹配右边 var reg: TPerlRegEx; begin ...