二话不说,直接上代码, 具体注释, 代码里简单的有写: 可以根据我后面给的两张效果图进行测试;
demo测试方法: 直接将如下代码复制到一个java文件中运行main方法即可;
注意: 代码中标记'todo'的地方自行修改;
package com.example.studybase._03_文件操作;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @use 利用Java代码给图片添加文字(透明图调低点,也可以当做水印)
*/
@Slf4j
public class WaterMarkUtils {
/**
* 编辑图片,往指定位置添加文字
* @param srcImgPath :源图片路径
* @param targetImgPath :保存图片路径
* @param list :文字集合
*/
public static void writeImage(String srcImgPath, String targetImgPath, List list) {
FileOutputStream outImgStream = null;
try {
//读取原图片信息
File srcImgFile = new File(srcImgPath);//得到文件
Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
int srcImgHeight = srcImg.getHeight(null);//获取图片的高
//添加文字:
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
for (ImageDTO imgDTO : list) {
g.setColor(imgDTO.getColor()); //根据图片的背景设置水印颜色
g.setFont(imgDTO.getFont()); //设置字体
g.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY()); //画出水印
}
g.dispose();
// 输出图片
outImgStream = new FileOutputStream(targetImgPath);
ImageIO.write(bufImg, "jpg", outImgStream);
} catch (Exception e) {
log.error("==== 系统异常::{} ====",e);
}finally {
try {
if (null != outImgStream){
outImgStream.flush();
outImgStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 创建ImageDTO, 每一个对象,代表在该图片中要插入的一段文字内容:
* @param text : 文本内容;
* @param color : 字体颜色(前三位)和透明度(第4位,值越小,越透明);
* @param font : 字体的样式和字体大小;
* @param x : 当前字体在该图片位置的横坐标;
* @param y : 当前字体在该图片位置的纵坐标;
* @return
*/
private static ImageDTO createImageDTO(String text,Color color,Font font,int x,int y){
ImageDTO imageDTO = new ImageDTO();
imageDTO.setText(text);
imageDTO.setColor(color);
imageDTO.setFont(font);
imageDTO.setX(x);
imageDTO.setY(y);
return imageDTO;
}
/**
* main方法:
* @param args
*/
public static void main(String[] args) {
//=========================================自行发挥================================
//todo 自己真实的地址:(如果项目中使用的阿里云,则自行改造'writeImage'方法,接受流对象就好了);
String srcImgPath="C:\\Users\\mm\\Desktop\\test.png"; //源图片地址
String tarImgPath="C:\\Users\\mm\\Desktop\\test1.png"; //目标图片的地址
//==============================================================================
//获取数据集合;
ArrayList list = new ArrayList<>();
list.add(createImageDTO("2020/02/02/15:30:30",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 78, 160));
list.add(createImageDTO("账户名称",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 178, 226));
list.add(createImageDTO("1111111",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 710, 226));
list.add(createImageDTO("上海银行",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 178, 290));
list.add(createImageDTO("这是用途",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 710, 290));
list.add(createImageDTO("¥50.00",new Color(255,59,48),new Font("微软雅黑", Font.PLAIN, 36), 270, 366));
//操作图片:
WaterMarkUtils.writeImage(srcImgPath, tarImgPath, list);
//这句代码,自己项目中可以不用加,在这里防止main方法报错的;
System.exit(0);
}
}
/**
* 存放文本内容的类
*/
@Setter
@Getter
class ImageDTO{
//文字内容
private String text;
//字体颜色和透明度
private Color color;
//字体和大小
private Font font;
//所在图片的x坐标
private int x;
//所在图片的y坐标
private int y;
}
执行前的效果:
执行后的效果: