JAVA 图片Graphics2D添加水印

package com.pit.common.utils.file;

import com.aspose.cad.internal.A.B;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.StandardCharsets;

public class ImageUtils {

    public InputStream addWatermark(InputStream inputStream,
                                    String bidName, String center,
                                    String time, String wather, String workSiteName,
                                    String createUser, String jianli, String content,
                                    String sgdw, String jidw
    ) throws Exception {
        try {
 
 			//也可以传入文件目录地址读取
			//File file = new File("目标文件路径");
			//Image srcImg = ImageIO.read(file);
            //把文件转换成图片
            Image srcImg = ImageIO.read(inputStream);
            //获取图片的宽和高
            int srcImgwidth = srcImg.getWidth(null);
            int srcImgheight = srcImg.getHeight(null);

            Font font = new Font("微软雅黑", Font.PLAIN, (int)(srcImgheight * 0.02));

            //画水印需要一个画板    创建一个画板
            BufferedImage buffImg = new BufferedImage(srcImgwidth, srcImgheight, BufferedImage.TYPE_INT_RGB);
            //创建一个2D的图像
            Graphics2D g = buffImg.createGraphics();
            g.setFont(font);
            //画出来
            g.drawImage(srcImg, 0, 0, srcImgwidth, srcImgheight, null);

            //设置水印的背景颜色
            //x坐标 等于 从左往右 横轴 的左边距百分比 width / 100 * 2
            //y坐标 等于 从上往下 竖轴 的上边距百分比 width / 100 * 55
            int x = (int)(srcImgwidth * 0.02);
            int y = (int)(srcImgheight * 0.55);
            Color color = new Color(35,98,185, 153);
            g.setColor(color);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.4F));
            g.fillRect(x ,y , (int)(srcImgwidth * 0.5), (int)(srcImgheight * 0.05));

            //设置水印的字体
            x = (int)(srcImgwidth * 0.24);
            y = (int)(srcImgheight * 0.58);
            color = new Color(255,255,255);
            g = buffImg.createGraphics();
            g.setFont(font);
            g.setColor(color);
            g.drawString("工程记录", x, y);


            //中间背景颜色
            x = (int)(srcImgwidth * 0.02);
            y = (int)(srcImgheight * 0.6);
            color = new Color(144,150,150);
            g = buffImg.createGraphics();
            g.setColor(color);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.4F));
            g.fillRect(x ,y , (int)(srcImgwidth * 0.5), (int)(srcImgheight * 0.3));

            //内容信息
            Graphics2D fontG = buffImg.createGraphics();
            Color fontColor = new Color(0,0,0);
            fontG.setColor(fontColor);
            fontG.setFont(font);
            String info = "标       段:" + "      "+ bidName;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.63);
            fontG.drawString(info, x, y);

            info  = "里       程:" + "      "+ center;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.66);
            fontG.drawString(info, x, y);

            info  = "拍摄时间:" + "      "+ time;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.71);
            fontG.drawString(info, x, y);

            info  = "天       气:" + "      "+ wather;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.74);
            fontG.drawString(info, x, y);

            info  = "工       点:" + "      "+ workSiteName;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.77);
            fontG.drawString(info, x, y);

            info  = "报  验 人:" + "      "+ createUser;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.82);
            fontG.drawString(info, x, y);

            info  = "监       理:" + "      "+ jianli;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.85);
            fontG.drawString(info, x, y);

            info  = "报验内容:" + "      "+ content;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.88);
            fontG.drawString(info, x, y);

            //施工单位,监理单位 背景
            x = (int)(srcImgwidth * 0.02);
            y = (int)(srcImgheight * 0.9);
            color = new Color(35,98,185, 153);
            g = buffImg.createGraphics();
            g.setColor(color);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.4F));
            g.fillRect(x ,y , (int)(srcImgwidth * 0.5), (int)(srcImgheight * 0.09));


            color = new Color(255,255,255);
            info  = "施工单位:" + "      "+ sgdw;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.94);
            fontG.setColor(color);
            fontG.drawString(info, x, y);

            info  = "监理单位:" + "      "+ jidw;
            x = (int)(srcImgwidth * 0.03);
            y = (int)(srcImgheight * 0.97);
            fontG.setColor(color);
            fontG.drawString(info, x, y);
            //释放画板的资源
            g.dispose();

            System.out.println("水印添加完成!");

            //水印文件输出到本地目录
//            FileOutputStream outputStream = new FileOutputStream(outImagePath);
            //创建新的图片
//            ImageIO.write(buffImg, "jpg", outputStream);
            //刷新流
//            outputStream.flush();
            //关闭流
//            outputStream.close();

            //输出成流
            //创建一个ByteArrayOutputStream
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            //把BufferedImage写入ByteArrayOutputStream
            ImageIO.write(buffImg, "jpg", os);
            //ByteArrayOutputStream转成InputStream
            InputStream input = new ByteArrayInputStream(os.toByteArray());

            return input;
        } catch (IOException e) {
            e.printStackTrace();
            throw new Exception("添加水印失败");
        }
    }

    /**
     * 获取水印的坐标
     *
     * @param watermarkContent 水印内容
     * @param g          2d图像
     * @return 水印的长度
     */
    public int getwaterMarkLength(String watermarkContent, Graphics2D g) {

        return g.getFontMetrics(g.getFont()).charsWidth(watermarkContent.toCharArray(), 0, watermarkContent.length());

    }

    public static void main(String[] args) throws Exception {

//        String srcImgPath = "C:\\Users\\Administrator\\Desktop\\图片\\v2-c16c4e757314dd2455f58dd5528eca9e_b.jpg";
//        String tarImgPath = "C:\\Users\\Administrator\\Desktop\\图片\\xiong-out.jpg";
//        ImageUtils aa = new ImageUtils();
//        aa.addWatermark(srcImgPath, tarImgPath);

//        String srcImgPath = "https:\\img0.baidu.com\\it\\u=3212920999,1827079299&fm=26&fmt=auto&gp=0.jpg";
//        String tarImgPath = "C:\\Users\\Administrator\\Desktop\\图片\\xiong-out.jpg";
//        ImageUtils aa = new ImageUtils();
//        aa.addWatermark(srcImgPath, tarImgPath);
    }

}

水印效果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中使用Graphics2D添加数字水印,可以遵循以下步骤: 1. 创建一个图像对象,并从文件读取图片: ```java BufferedImage image = ImageIO.read(new File("path/to/image.jpg")); ``` 2. 获取Graphics2D对象: ```java Graphics2D g2d = image.createGraphics(); ``` 3. 设置字体和颜色: ```java Font font = new Font("Arial", Font.BOLD, 30); g2d.setFont(font); g2d.setColor(Color.WHITE); ``` 4. 绘制水印文字: ```java String watermarkText = "123456"; g2d.drawString(watermarkText, x, y); ``` 5. 保存修改后的图像: ```java ImageIO.write(image, "jpg", new File("path/to/new_image.jpg")); ``` 完整的代码示例: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class WatermarkExample { public static void main(String[] args) throws Exception { BufferedImage image = ImageIO.read(new File("path/to/image.jpg")); Graphics2D g2d = image.createGraphics(); Font font = new Font("Arial", Font.BOLD, 30); g2d.setFont(font); g2d.setColor(Color.WHITE); String watermarkText = "123456"; int x = 50; int y = 50; g2d.drawString(watermarkText, x, y); ImageIO.write(image, "jpg", new File("path/to/new_image.jpg")); } } ``` 注意事项: - 在绘制水印文字前,可以对图片进行缩放、裁剪等操作; - 可以根据需要调整字体大小、颜色、位置等参数; - 可以使用不同的文件格式保存修改后的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值