最近开发一款卡片app,但上传到服务器的卡片中有一种是图片相同,只是文字不同,为了减少UI工作量,通过图片加水印的方式在后台将文字添加到图片上,并将合成的图片上传到服务器,如下是整个实现过程:
首先是工具类:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
public class WaterMarkUtils {
/**
* @param srcImgPath 源图片路径
* @param tarImgPath 保存的图片路径
* @param waterMarkContent 水印内容
*/
public static boolean addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent) {
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);
Color color = Color.white;
g.setColor(color); //根据图片的背景设置水印颜色
Font font = new Font("黑体", Font.PLAIN, 32);
g.setFont(font); //设置字体
// 一行14个位置,超出部分进行换行
int page = (int) Math.ceil((double)waterMarkContent.length()/14);
for (int i = 0; i < page; i++) {
String sub = null;
if ((i+1)*14 < waterMarkContent.length()) {
sub = waterMarkContent.substring(i*14, (i+1)*14);
} else {
sub = waterMarkContent.substring(i*14, waterMarkContent.length());
}
g.drawString(sub, 70, 340+i*48); // 画文字
}
g.dispose();
// 输出图片
FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
ImageIO.write(bufImg, "png", outImgStream);
outImgStream.flush();
outImgStream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
System.out.println("添加水印完成");
return true;
}
public static void main(String[] args) {
String srcImgPath="C:/Users/18702/Desktop/素材/cba/1.png"; //源图片地址
String tarImgPath="C:/Users/18702/Desktop/素材/cba/2.png"; //待存储的地址
String waterMarkContent="今天是个好日子啊今天又是充满希望的一天!今天是个好日子啊今天又是充满希望的一天!今天是个好日子啊今天又是充满希望的一天!"; //水印内容
addWaterMark(srcImgPath, tarImgPath, waterMarkContent);
}
}
如WaterMarkUtils 所示,只需传三个参数,源图片地址、待存储的地址、文字内容,代码中有详细的注释。
使用时直接调用addWaterMark接口就可以了,注意,如果要将代码部署到linux服务器,你需要确认服务器有添加文字需要的字体。之前一直卡在这一步,本地能正常添加文字,部署到服务器后只显示英语或数字,但中文却不显示了,其解决方案如下:
1.
fc-list ----------检查所有已有的字体
如果显示上图所示,则
2.
yum -y install fontconfig ----------安装字体库
3.打开c盘下的Windows/Fonts目录,将需要的字体复制并上传到服务器/usr/share/fonts/zh_CN目录下,如果没有该目录,可以用mkdir命令进行创建
4.
chmod 766 msyh.ttf ----------修改字体权限
5.建立字体缓存
mkfontscale
mkfontdir
fc-cache -fv
- 重启tomcat服务器
最后展示效果图: