最近开发一款卡片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                   ----------检查所有已有的字体

java 图片 水印 java实现图片加水印_java 图片 水印


如果显示上图所示,则

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
  1. 重启tomcat服务器
    最后展示效果图:

java 图片 水印 java实现图片加水印_java_02

java 图片 水印 java实现图片加水印_java_03