前言
最近在网上看到有合成《有内鬼,终止交易》的图片,闲来无事自己也玩玩
最终效果图

实现原理
用java原生自带的图片工具类将文字和背景图进行合成
素材

代码实现
public static void main(String[] args) throws Exception {
// 字体文件地址
Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream ("/Users/hans/work_space/java_project/javase/src/asm/img/nokia.ttf"));
// Font font = new Font(" 微软雅黑 ", Font.PLAIN, 60);
font = font.deriveFont(Font.BOLD, 60L);
//水印字体
String srcImgPath="/Users/hans/work_space/java_project/javase/src/asm/img/nokia.jpg"; //源图片地址
String tarImgPath="/Users/hans/work_space/java_project/javase/src/asm/img/test_1.jpeg"; //待存储的地址
String waterMarkContent="有内鬼,终止交易!"; //水印内容
// 字体颜色
Color markContentColor = new Color(0, 0, 0);
// Color color = new Color(255, 255, 255, 128);
// 读取原图片信息
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);
Graphics 2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
g.setColor(markContentColor); //根据图片的背景设置水印颜色
g.setFont(font); //设置字体
//设置水印的坐标
int x = 250;
int y = 400;
// 字体倾斜角度
Integer degree = 10;
if (null != degree) {
g.rotate(Math.toRadians(degree), 300, 500);//设置水印旋转
}
g.drawString(waterMarkContent, x, y); //画出水印
g.dispose();
// 输出图片
FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
ImageIO.write(bufImg, " jpg ", outImgStream);
System.out.println("添加水印完成");
outImgStream.flush();
outImgStream.close();
}
注意事项
– 其中如上的水印xy坐标需要用其他工具计算,这个方法很多,可以用ps这种图片编辑工具,也可以用不断测试法
– 字体样式呢也可以自己去找合适的,目前我找的这个看起来还是有些别扭
– 字体的倾斜角度这个得一点一点的调试,不断修改数据,不断查看效果
– 调试阶段最好将字体的颜色设置为红色这种非常显眼的,否则如果生成的图片没有任何变化可能是字体太小、颜色不明显造成调试时间的浪费