Java添加水印

本文详细介绍了如何使用Java编程实现为图片添加水印的功能,包括选择合适的库,设置水印位置、角度、透明度等参数,以及实际的代码示例。
摘要由CSDN通过智能技术生成
/**
 * @description
 * @param sourceImgPath 源图片路径
 * @param tarImgPath 保存的图片路径
 * @param waterMarkContent 水印内容
 * @param fileExt 图片格式
 * @return void
 */
public static void addWaterMark(String sourceImgPath, String tarImgPath, String waterMarkContent,String fileExt){
    Font font = new Font("宋体", Font.BOLD, 18);//水印字体,大小
    Color markContentColor = new Color(245, 245, 245); // 水印颜色,RGB
    Integer degree = -25; // 设置水印文字的旋转角度
    float alpha = 1.0f; // 设置水印透明度 默认为1.0  值越小颜色越浅
    OutputStream outImgStream = null;
    try {
        File srcImgFile = new File(sourceImgPath);
        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);
        g.setColor(markContentColor); 
        g.setFont(font);              
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); 
        if (null != degree) {
            g.rotate(Math.toRadians(degree),(double)bufImg.getWidth(),(double)bufImg.getHeight());
        }
        JLabel label = new JLabel(waterMarkContent);
        FontMetrics metrics = label.getFontMetrics(font);
        int width = metrics.stringWidth(label.getText());
        int rowsNumber = srcImgHeight/width+srcImgHeight%width; // 打印的行数=图片的高/文字水印的宽  
        int columnsNumber = srcImgWidth/width+srcImgWidth%width; // 每行打印的列数=图片的宽/文字水印的宽
        // 至少打印一次,防止图片太小而文字水印太长
        if(rowsNumber < 1){
            rowsNumber = 1;
        }
        if(columnsNumber < 1){
            columnsNumber = 1;
        }
        for(int j=0;j<rowsNumber;j++){
            for(int i=0;i<columnsNumber;i++){
                // 画出水印,设置水印位置
                g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);
            }
        }
        g.dispose();// 释放资源
        // 输出图片
        outImgStream = new FileOutputStream(tarImgPath);
        ImageIO.write(bufImg, fileExt, outImgStream);
    } catch (Exception e) {
        e.printStackTrace();
        e.getMessage();
    } finally{
        try {
            if(outImgStream != null){
                outImgStream.flush();
                outImgStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            e.getMessage();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值