2021-10-12 java 图片加水印

java 给图片加水印的方式

代码可以直接使用 代码片.

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

public class ImageUtil {
    
    // 水印字体
    private static final Font FONT = new Font("微软雅黑", Font.PLAIN, 14);
    // 透明度
    private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
    // 水印之间的间隔
    private static final int XMOVE = 60;
    // 水印之间的间隔
    private static final int YMOVE = 82;


    /**
     *  @param pressText 水印文案
     * @param targetImg 目标图片地址
     * @param color 字体颜色
     * @param fileSuffix
     */
    public static void pressTest(String pressText, String targetImg, Color color, String fileSuffix) {
        try {
            File file = new File(targetImg);
            Image src = ImageIO.read(file);
            int width = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
            Graphics2D graphics = image.createGraphics( );
            graphics.drawImage(src,0,0,width,height,null);

            graphics.setColor(color);

            // 设置水印透明度
            graphics.setComposite(COMPOSITE);

            // 设置倾斜角度
            graphics.rotate(Math.toRadians(-35), (double) image.getWidth() / 2, (double) image.getHeight() / 2);

            // 设置水印字体
            graphics.setFont(FONT);

            // 消除java.awt.Font字体的锯齿
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            int x = -width / 2;
            int y;

            // 字体长度
            int markWidth = FONT.getSize() * getTextLength(pressText);
            // 字体高度
            int markHeight = FONT.getSize();

            // 循环添加水印
            while (x < width * 1.5) {
                y = -height / 2;
                while (y < height * 1.5) {
                    graphics.drawString(pressText, x, y);
                    y += markHeight + YMOVE;
                }
                x += markWidth + XMOVE;
            }

            graphics.dispose();
            FileOutputStream fileOutputStream = new FileOutputStream(targetImg);
            ImageIO.write(image, fileSuffix, fileOutputStream);
            fileOutputStream.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //计算水印文本长度
    //1、中文长度即文本长度 2、英文长度为文本长度二分之一
    public static int getTextLength(String text) {
        //水印文字长度
        int length = text.length();

        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                length++;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }


}

之前工作遇到的小需求,根据网上资料查询整理的工具类,但是找不到原本作者的链接了~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值