画图添加水印

/**
     * 添加水印
     */
    public static void addTextWatermark(Graphics2D graphics2D,int srcImgWidth,int srcImgHeight,String textWatermark,
                                        Integer watermarkLocation,Color color,Font font,Integer horizontalRelativeOffset,Integer verticalRelativeOffset){
        //-------------------------文字水印 start----------------------------
        //根据图片的背景设置水印颜色
        graphics2D.setColor(color);
        //设置字体  画笔字体样式为微软雅黑,加粗,文字大小为60pt
        graphics2D.setFont(font);
        //设置水印的坐标(为原图片中间位置)
        //textWatermark为水印内容
        if (watermarkLocation == null){
            watermarkLocation = WatermarkLocationEnum.CENTRE.getWatermarkLocation();
        }
        Map<String,Integer> location = getWatermarkLocation(watermarkLocation,srcImgWidth,srcImgHeight,textWatermark,graphics2D);
        if (horizontalRelativeOffset == null){
            horizontalRelativeOffset = 0;
        }
        if (verticalRelativeOffset == null){
            verticalRelativeOffset = 0;
        }
        int x = location.get("x")+horizontalRelativeOffset;
        int y = location.get("y")+verticalRelativeOffset;
        //画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
        graphics2D.drawString(textWatermark, x, y);
        //-------------------------文字水印 end----------------------------
    }

    /**
     * 获取水印位置
     * @return
     */
    public static Map<String,Integer> getWatermarkLocation(Integer watermarkLocation,int srcImgWidth,int srcImgHeight,String textWatermark,Graphics2D graphics2D){
        Map<String,Integer> map = new HashMap<>();
        if (WatermarkLocationEnum.TOP_LEFT_CORNER.getWatermarkLocation().equals(watermarkLocation)){
            int y=getWatermarkHeight(graphics2D);
            map.put("x",0);
            map.put("y",y);
        }else if (WatermarkLocationEnum.ABOVE_CENTRE.getWatermarkLocation().equals(watermarkLocation)){
            int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D)) / 2;
            int y=getWatermarkHeight(graphics2D);
            map.put("x",x);
            map.put("y",y);
        }else if (WatermarkLocationEnum.UPPER_RIGHT_CORNER.getWatermarkLocation().equals(watermarkLocation)){
            int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D));
            int y=getWatermarkHeight(graphics2D);
            map.put("x",x);
            map.put("y",y);
        }else if (WatermarkLocationEnum.CENTER_LEFT.getWatermarkLocation().equals(watermarkLocation)){
            int y=srcImgHeight / 2;
            map.put("x",0);
            map.put("y",y);
        }else if (WatermarkLocationEnum.CENTRE.getWatermarkLocation().equals(watermarkLocation)){
            int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D)) / 2;
            int y=srcImgHeight / 2;
            map.put("x",x);
            map.put("y",y);
        }else if (WatermarkLocationEnum.CENTER_RIGHT.getWatermarkLocation().equals(watermarkLocation)){
            int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D));
            int y=srcImgHeight / 2;
            map.put("x",x);
            map.put("y",y);
        }else if (WatermarkLocationEnum.LOWER_LEFT_QUARTER.getWatermarkLocation().equals(watermarkLocation)){
            int y=srcImgHeight - getWatermarkHeight(graphics2D)/2;
            map.put("x",0);
            map.put("y",y);
        }else if (WatermarkLocationEnum.LOWER_CENTER.getWatermarkLocation().equals(watermarkLocation)){
            int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D)) / 2;
            int y=srcImgHeight - getWatermarkHeight(graphics2D)/2;
            map.put("x",x);
            map.put("y",y);
        }else if (WatermarkLocationEnum.LOWER_RIGHT_CORNER.getWatermarkLocation().equals(watermarkLocation)){
            int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D));
            int y=srcImgHeight - getWatermarkHeight(graphics2D)/2;
            map.put("x",x);
            map.put("y",y);
        }
        return map;
    }

    public static void main(String[] args) {
        // 读取原图片信息 得到文件
        File srcImgFile = new File("C:\\Users\\zmd\\Pictures\\微信图片_20230322145124.jpg");
        //将文件对象转化为图片对象
        Image srcImg = null;
        try {
            srcImg = ImageIO.read(srcImgFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取图片的宽
        int srcImgWidth = srcImg.getWidth(null);
        //获取图片的高
        int srcImgHeight = srcImg.getHeight(null);
        BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
        // 加水印
        //创建画笔
        Graphics2D graphics2D = bufImg.createGraphics();
        //绘制原始图片
        graphics2D.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
        Color color = new Color(25, 227, 160);
        Font font =  new Font("楷体", Font.ITALIC, 20);
        //水平相对偏移
        Integer horizontalRelativeOffset = 100;
        //垂直相对偏移
        Integer verticalRelativeOffset = 400;
        addTextWatermark(graphics2D,srcImgWidth,srcImgHeight,"hello world",
                WatermarkLocationEnum.CENTRE.getWatermarkLocation(),color,font,horizontalRelativeOffset,verticalRelativeOffset);
        ByteArrayOutputStream os = null;
        MultipartFile multipartFile = null;
        try {
//            outImgStream = new FileOutputStream(tarImgPath);
//            ImageIO.write(bufImg, "png", outImgStream);

            //创建一个ByteArrayOutputStream
            os = new ByteArrayOutputStream();
            //把BufferedImage写入ByteArrayOutputStream
            //此处要写PNG否则可能会出现遮罩层
            ImageIO.write(bufImg, "jpg", os);
            //ByteArrayOutputStream转成InputStream
            InputStream input = new ByteArrayInputStream(os.toByteArray());
            multipartFile =new MockMultipartFile("file", "file.png", "text/plain", input);
            multipartFile.transferTo(new File("d:/o.jpg"));
        } catch (Exception  e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
//                if (null != outImgStream) {
//                    outImgStream.flush();
//                    outImgStream.close();
//                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 获取水印文字的长度
     * @param waterMarkContent
     * @param graphics2D
     * @return
     */
    public static int getWatermarkLength(String waterMarkContent, Graphics2D graphics2D) {
        return graphics2D.getFontMetrics(graphics2D.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }
    /**
     * 获取水印文字的高度
     * @param graphics2D
     * @return
     */
    public static int getWatermarkHeight(Graphics2D graphics2D) {
        return graphics2D.getFontMetrics(graphics2D.getFont()).getHeight();
    }
public static void addImageWatermark(Graphics2D graphics2D,int srcImgWidth,int srcImgHeight,String imageWatermark,int type){
        //-------------------------图片水印 start----------------------------
        //水印文件
        //创建一个URL对象,获取网络图片的地址信息(网络图片)
        URL url = null;
        //将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
        Image srcWaterMark = null;
        try {
            url = new URL(imageWatermark);
            srcWaterMark = ImageIO.read(url.openStream());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
        graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
        //x,y为章需要合成到A图片上的位置坐标,w,h为将章缩小到多少长宽比例
        //注意这行代码:graphics2D.drawlmage(img, x, y, w, h, null);
        //绘制水印图片 坐标为自己选择
        int x = 0;
        int y = 0;
        int width = (int)(srcImgWidth*0.1);
        int height = (int)(srcImgWidth*0.1);
        if (type == 1) {
            //覆盖图片位于左上角
            x = 0;
            y = 0;
        } else if (type == 2) {
            //覆盖图片位于右上角
            x = srcImgWidth - width;
            y = 0;
        } else if (type == 3) {
            //覆盖图片位于左下角
            x = 0;
            y = srcImgHeight - height;
        } else if (type == 4) {
            //覆盖图片位于右下角
            x = srcImgWidth - width;
            y = srcImgHeight - height;
        } else if (type == 5 ){
            //覆盖图片位于中间
            x = (srcImgWidth - width) / 2;
            y = (srcImgWidth - height) / 2;
        }
        graphics2D.drawImage(srcWaterMark, x, y ,width, height, null);
        // 水印文件结束
        graphics2D.dispose();
        //-------------------------图片水印 end----------------------------
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞流银河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值