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

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

代码:

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. 160812、apache milagro分布式安全认证系统

    java32位.64位及js的代码:http://pan.baidu.com/s/1cqnwuE 一.云链接为中心的软件及需要互联网规模物联网设备 二.利用双线性密码学分发加密操作和分裂的加密参数 三 ...

  2. Oracle实例的恢复、介质恢复( crash recovery)( Media recovery)

    实例的恢复( crash recovery) 什么时候发生Oracle实例恢复? shutdown abort; 数据库异常down掉(机器死机,掉电...) 实例恢复的原因是数据有丢掉,使用redo ...

  3. Phonetic Symbols&Rules of Pronunciation

    音标 Phonetic Symbols http://yinbiao.tingclass.net/ 1.1元音 1.1.元音:元音有20个,其中单元音12个,双元音8个. (1)“短”单元音 [i] ...

  4. 三种系统监控工具对比:top vs Htop vs Glances

    首先启用 EPEL Repository: yum -y install epel-release 启用 EPEL Repository 後, 可以用 yum 直接安裝 Htop: yum -y in ...

  5. python类的相关知识第二部分

    类的继承.多态.封装 一.类的继承 1.应用场景: 类大部分功能相同,大类包含小类的情况 例如: 动物类 共性:都要吃喝拉撒.都有头有脚 特性: 猫类.走了很轻,叫声特别,喜欢白天睡觉 狗类.的叫声很 ...

  6. 【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 ...

  7. 【人员招聘】岗位职责和技能要求——By Me

  8. RTSP客户端接收存储数据(live555库中的openRTSP实例)

    一.openRTSP编译运行 a)windows下编译运行 还是以mediaServer作为服务端,openRTSP作为客户端 b)Linux下编译运行 转自http://kuafu80.blog.1 ...

  9. PyMySQL防止SQL注入

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  10. SQL基础一

    一.什么是SQL? SQL是结构化查询语言 SQL使我们有能力访问数据库 SQL是一种ANSI的标准计算机语言 二.SQL能做什么? SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可 ...