使用Graphics2D为图片添加文字或图片水印及文字乱码解决

备注

  • 使用java的Graphics2D来为图片添加水印,不需要额外的依赖,还是非常方便的
  • 适应的场景也不必局限与添加水印,还可以用来生成证书图片、盖章等等
  • 这里两个方法也是只用传参即可,可以写个工具类复制过去,没事用着玩

图片添加文字水印

/**
 * 图片添加文字水印
 * @param originalImage 原始图片
 * @param watermarkX 水印距左边的距离
 * @param watermarkY 水印距上边的距离
 * @param alpha 透明度 [0.0, 1.0] 越大越清晰
 * @param text 文字内容
 * @param color 文字颜色
 * @param font 字体
 * @param style 字体风格
 * @param size 字号
 * @return
 */
public static BufferedImage imageAddText(BufferedImage originalImage, int watermarkX, int watermarkY,
										 float alpha, String text, Color color, String font, int style, int size){
    try {
        // 创建一个新的图片,大小与原始图片相同
        BufferedImage watermarkedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
        // 创建一个Graphics2D对象,用于在新图片上绘制水印
        Graphics2D g2d = (Graphics2D) watermarkedImage.getGraphics();
        // 在新图片上绘制原始图片
        g2d.drawImage(originalImage, 0, 0, null);
        // 设置透明度
        AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2d.setComposite(alphaComposite);
        // 设置水印文字的颜色和字体和大小
        g2d.setColor(color);
        Font watermarkFont = new Font(font, style, size);
        g2d.setFont(watermarkFont);
        // 绘制水印图片
        g2d.drawString(text, watermarkX, watermarkY);
        // 保存添加水印后的图片
        ImageIO.write(watermarkedImage, "jpg", new File("newImage.jpg"));
        // 释放资源
        g2d.dispose();
        System.out.println("Watermark added successfully.");
        return watermarkedImage;
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(e.getMessage());
    }
}

图片加图片水印

/**
 * 图片加图片水印
 * @param originalImage 原始图片
 * @param watermarkImage 添加的水印图片
 * @param watermarkWidth 水印图片宽度像素(0为不修改)
 * @param watermarkHeight 水印图片高度像素(0为不修改)
 * @param watermarkX 水印距原始图片左边的距离
 * @param watermarkY 水印距原始图片上边的距离
 * @param alpha 透明度 [0.0, 1.0] 越大越清晰
 * @return
 */
public static BufferedImage imageAddImage(BufferedImage originalImage, BufferedImage watermarkImage,
                                          int watermarkWidth,int watermarkHeight,int watermarkX,int watermarkY,float alpha){
    try {
        // 创建一个新的图片,大小与原始图片相同
        BufferedImage watermarkedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
        // 创建一个Graphics2D对象,用于在新图片上绘制水印
        Graphics2D g2d = (Graphics2D) watermarkedImage.getGraphics();
        // 在新图片上绘制原始图片
        g2d.drawImage(originalImage, 0, 0, null);
        // 设置透明度
        AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2d.setComposite(alphaComposite);
        // 绘制水印图片
        if (watermarkX == 0 || watermarkY == 0) {
            watermarkX = watermarkImage.getWidth();
            watermarkY = watermarkImage.getHeight();
        }
        g2d.drawImage(watermarkImage, watermarkX, watermarkY, watermarkWidth, watermarkHeight, null);
        // 保存添加水印后的图片
        ImageIO.write(watermarkedImage, "jpg", new File("newImage.jpg"));
        // 释放资源
        g2d.dispose();
        System.out.println("Watermark added successfully.");
        return watermarkedImage;
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(e.getMessage());
    }
}

测试

public static void main(String[] args) {
    try {
        BufferedImage originalImage = ImageIO.read(new File("C:\\Users\\x\\Pictures\\template.png"));
        BufferedImage watermarkImage = ImageIO.read(new File("C:\\Users\\x\\Pictures\\watermark.jpg"));
        watermarkImage = imageAddImage(originalImage, watermarkImage, 200, 100, 50, 50, 1.0f);
        watermarkImage = imageAddText(watermarkImage, 100, 150, 0.5f, "水印文字", Color.BLACK, "宋体", Font.PLAIN, 20);
        String outputImagePath = "C:\\Users\\x\\Pictures\\newImage.jpg";
        ImageIO.write(watermarkImage, "jpg", new File(outputImagePath));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

文字乱码

  • 如果本地(windows)测试无问题,但部署到线上环境(centos7)会出现文字乱码,可能是字体缺失导致的
  1. 创建字体目录
mkdir -p /usr/share/fonts/chinese
  1. 上传字体,复制C:\Windows\Fonts下对应字体,后缀改为ttf(例如:宋体.ttf),上传到创建的目录下
  2. 安装字体索引工具
yum install -y mkfontscale
yum install -y fontconfig
  1. 安装字体
cd /usr/share/fonts/chinese
mkfontscale
mkfontdir
fc-cache
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值