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

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

代码:

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. [LintCode] 合并排序数组

    A subroutine of merge sort. class Solution { public: /** * @param A and B: sorted integer array A an ...

  2. CSS 伪元素 使用参考

    伪元素可以做得事情是非常多的,详情大家可以参考这里 大放异彩的伪元素——可以做什么? 本篇主要讲两个伪元素:before和:after的几个要点: 1.:before和:after是加在元素的里面,也 ...

  3. “绝对”妹纸~position

    CSS:布局之fixed,relative,absolute 记住abs是跟随 relative的,没有看到position:relative;之前他会一直向上查找. 直到执着的找到relative! ...

  4. phpmail发送邮件

    ---恢复内容开始--- 首先.需要phpmailer的包. 地址:https://github.com/Synchro/PHPMailer 解开压缩包,将class.phpmailer.php,cl ...

  5. C#中对文件的操作小结

    1.建立一个文本文件 public class FileClass { public static void Main() { WriteToFile(); } static void WriteTo ...

  6. Gson 解析多层嵌套JSON数据

    http://stackoverflow.com/questions/14139437/java-type-generic-as-argument-for-gson

  7. linkText()的用法

    1.linkText()常用于定位链接,以谷歌的gmail为例: WebElement gmailLink = driver.findElement(By.linkText("Gmail&q ...

  8. python列表套字典数据类型转换

    1.题目 list3 = [ {'name':'Alex','hobby':'抽烟'}, {'name':'Alex', 'hobby':'喝酒'}, {'name':'Alex', 'hobby': ...

  9. 【我的Android进阶之旅】推荐一款能提升数十倍效率的Android应用开发助手

    一功能介绍 a调试相关 1布局边界 2布局更新 3强制GPU渲染 4GPU渲染 5指针位置 6严格模式 7不保留应用 8不锁定屏幕 9开发者选项 10系统设置 11语言设置 12USB调试 b UI相 ...

  10. 我的Android进阶之旅------>android Button上面的英文字符串自动大写的问题解决

    今天碰到一个关于Button的问题:android Button上面的英文字符串会自动变成大写,运行的Android 5.1版本,如下图所示: 图1:Button 图2:TextView 这个Butt ...