Java添加水印

/**
 * @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();
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java添加水印可以使用 Graphics2D 类的 drawString 方法和 drawImage 方法,等比缩放可以使用 AffineTransform 类。 下面是一个简单的示例代码: ```java import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class Watermark { public static void main(String[] args) throws IOException { // 读取原始图片 BufferedImage originalImage = ImageIO.read(new File("original.png")); // 创建带有透明背景的 BufferedImage BufferedImage newImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_ARGB); // 获取 Graphics2D 对象 Graphics2D g2d = newImage.createGraphics(); // 将原始图片绘制到新图片上 g2d.drawImage(originalImage, 0, 0, null); // 添加水印 g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); g2d.setColor(Color.WHITE); g2d.setFont(new Font("Arial", Font.BOLD, 48)); g2d.drawString("Watermark", 50, 100); // 等比缩放 int newWidth = 400; // 新宽度 int newHeight = (int) (originalImage.getHeight() * ((double) newWidth / originalImage.getWidth())); // 新高度 AffineTransform transform = new AffineTransform(); transform.scale((double) newWidth / originalImage.getWidth(), (double) newHeight / originalImage.getHeight()); BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D scaledGraphics = scaledImage.createGraphics(); scaledGraphics.drawImage(originalImage, transform, null); // 保存新图片 ImageIO.write(newImage, "png", new File("new.png")); ImageIO.write(scaledImage, "png", new File("scaled.png")); // 关闭 Graphics2D 对象 g2d.dispose(); scaledGraphics.dispose(); } } ``` 这个示例代码读取了一个名为 `original.png` 的图片,将它绘制到一个带有透明背景的 BufferedImage 上,并在图片添加了一个白色的透明水印。然后使用 AffineTransform 类对图片进行等比缩放,并保存到名为 `new.png` 和 `scaled.png` 的文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值