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,并且设置了一些属性,下面看一下效果图 一切都是这么的美好,跟我们 ...
随机推荐
- 160812、apache milagro分布式安全认证系统
java32位.64位及js的代码:http://pan.baidu.com/s/1cqnwuE 一.云链接为中心的软件及需要互联网规模物联网设备 二.利用双线性密码学分发加密操作和分裂的加密参数 三 ...
- Oracle实例的恢复、介质恢复( crash recovery)( Media recovery)
实例的恢复( crash recovery) 什么时候发生Oracle实例恢复? shutdown abort; 数据库异常down掉(机器死机,掉电...) 实例恢复的原因是数据有丢掉,使用redo ...
- Phonetic Symbols&Rules of Pronunciation
音标 Phonetic Symbols http://yinbiao.tingclass.net/ 1.1元音 1.1.元音:元音有20个,其中单元音12个,双元音8个. (1)“短”单元音 [i] ...
- 三种系统监控工具对比:top vs Htop vs Glances
首先启用 EPEL Repository: yum -y install epel-release 启用 EPEL Repository 後, 可以用 yum 直接安裝 Htop: yum -y in ...
- python类的相关知识第二部分
类的继承.多态.封装 一.类的继承 1.应用场景: 类大部分功能相同,大类包含小类的情况 例如: 动物类 共性:都要吃喝拉撒.都有头有脚 特性: 猫类.走了很轻,叫声特别,喜欢白天睡觉 狗类.的叫声很 ...
- 【MonogDB】The description of index(二) Embedded and document Index
In this blog, we will talk about another the index which was called "The embedded ". First ...
- 【人员招聘】岗位职责和技能要求——By Me
- RTSP客户端接收存储数据(live555库中的openRTSP实例)
一.openRTSP编译运行 a)windows下编译运行 还是以mediaServer作为服务端,openRTSP作为客户端 b)Linux下编译运行 转自http://kuafu80.blog.1 ...
- PyMySQL防止SQL注入
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- SQL基础一
一.什么是SQL? SQL是结构化查询语言 SQL使我们有能力访问数据库 SQL是一种ANSI的标准计算机语言 二.SQL能做什么? SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可 ...