Graphics2D绘制多图片水印方法

/***@paramsrcPath需要添加水印的完整地址*@paramids需要添加的水印的id集合,结果以”,”分隔*@return返回包含水印图片的输入流*@throwsException*/publicInputStreamaddWatermark(StringsrcPath,Str…

大家好,又见面了,我是你们的朋友全栈君。

还有一篇文章添加多种水印(文字水印(带背景颜色) +图片水印)大家可以看一下、
https://blog.csdn.net/whiteGu/article/details/97653571

/**
     * @param srcPath 需要添加水印的完整地址
     * @param ids     需要添加的水印的id集合 ,结果以 ","分隔
     * @return 返回包含水印图片的输入流
     * @throws Exception
     */
    public InputStream addWatermark(String srcPath, String ids) throws Exception {
        File waterFile1 = null;
        File waterFile2 = null;
        Image watermarkImage1 = null;
        Image watermarkImage2 = null;
        String fileSuffix = srcPath.substring(srcPath.lastIndexOf(".") + 1);
        if (StringUtils.isBlank(ids)) throw new BaseAppException("必传水印id");
        List<SysWatermark> sysWatermarks = Arrays.stream(ids.split(",")).map(x -> sysWatermarkService.getByPrimaryKey(x)
        ).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(sysWatermarks)) throw new BaseAppException("没有对应的水印模板");

        //获取图片路径
        String waterImagePath1 = imgPrefix + sysWatermarks.get(0).getWatermarkUrl();
        File srcFile = new File(srcPath);
        waterFile1 = new File(waterImagePath1);
        if (sysWatermarks.size() > 1) {
            String waterImagePath2 = imgPrefix + sysWatermarks.get(1).getWatermarkUrl();
            waterFile2 = new File(waterImagePath2);
        }
        //读取原图片
        try {
            Image srcImage = ImageIO.read(srcFile);
            int height = srcImage.getHeight(null);
            int width = srcImage.getWidth(null);
            if (width > 1000 || height > 1000) {
                throw new BaseAppException("图片大小最大不能大于1000*1000");
            }
            //准备画板
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //创建画笔
            Graphics2D graphics = bufferedImage.createGraphics();
            graphics.drawImage(srcImage, width, height, null);
            //读取水印
            Image temp1 = ImageIO.read(waterFile1);
            ImageIcon imageIcon1 = new ImageIcon(temp1);
            watermarkImage1 = imageIcon1.getImage();
            //读取第二张水印
            if (null != waterFile2) {
                Image temp2 = ImageIO.read(waterFile2);
                ImageIcon imageIcon2 = new ImageIcon(temp2);
                watermarkImage2 = imageIcon2.getImage();
            }
            //第一张水印图片的透明度
            watermarkCoordinate(graphics, sysWatermarks.get(0), watermarkImage1, width, height);
            //处理第二张水印(如果是多水印可以采用循环方式,由于我这里只会有2张水印所以写死了)
            if (null != watermarkImage2) {
                watermarkCoordinate(graphics, sysWatermarks.get(1), watermarkImage2, width, height);
            }
            graphics.dispose();
             //本地测试
            OutputStream outputStream = new FileOutputStream("D:/test.jpg");
            ImageIO.write(bufferedImage, "JPG", outputStream);
            //本地测试结束(如果是本地测试下面不需要)
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, fileSuffix, os);
            return new ByteArrayInputStream(os.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
            throw new BaseAppException("读取图片失败");
        }
    }

    /**
     * 添加水印管理
     *
     * @param graphics     画笔
     * @param sysWatermark 水印
     * @param image        水印图片
     * @param width        需要添加水印图的宽度
     * @param height       需要添加水印图的高度
     */
    private void watermarkCoordinate(Graphics2D graphics, SysWatermark sysWatermark, Image image, int width, int height) {
        float transparency = sysWatermark.getWatermarkTransparency() / 100;
        graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, transparency));
        //放上水印图
        String coordinate = sysWatermark.getWatermarkCoordinate();
        JSONObject parseObject = JSONObject.parseObject(coordinate);
        int watermarkWidth = (int) parseObject.get("width");
        int watermarkHeight = (int) parseObject.get("height");
        graphics.drawImage(image, width * watermarkWidth / 100, height * watermarkHeight / 100, null);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129084.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • web api 学习 索引

    web api 学习 索引

    2021年9月13日
  • c语言超出数组范围会怎样_有一个整型数组a,其中含有n个元素

    c语言超出数组范围会怎样_有一个整型数组a,其中含有n个元素摘要:细腻完整冲泡程序,中组的则细腻具精精致爱、巧可的茶所有,之首六大的是茶类堪称。引用元素根本资本织的目的家建垄断立垄了(断组是为。相对如梦寐”杜甫的哪出自首诗,数组“夜秉烛阑更。…细腻完整冲泡程序,中组的则细腻具精精致爱、巧可的茶所有,之首六大的是茶类堪称。程序超出作者《洛》的神赋是(。引用元素根本资本织的目的家建垄断立垄了(断组是为。格包资本主义的垄断价括(。夕阳西下,西风古道瘦马,人在…

    2022年10月10日
  • Python字符串使用详解

    Python字符串使用详解除了数字,Python中最常见的数据类型就是字符串,无论那种编程语言,字符串无处不在。例如,从用户哪里读取字符串,并将字符串打印到屏幕显示出来。字符串是一种数据结构,这让我们有机会学习索引和切片——用于从字符串中提取子串的方法。1字符串索引在Python语法支持中,我们简单的阐述过字符串的使用,现在我们看看python程序在处理字符串时,如何对其进行索引,打印出其中的每个字符串。我们输入一个字符串:’你好,Lucky’,Python使用方括号[]来对字符串进行索引,方括号内的数字0~n表

    2022年10月25日
  • strictmode android,Android StrictMode使用「建议收藏」

    strictmode android,Android StrictMode使用「建议收藏」StrictMode是Android提供的一个开发工具,用于检测一些异常的操作,以便开发者进行修复。StrictMode可以监控以下问题,不应该在应用主线程中完成的工作,包括磁盘读写、网络访问等。内存泄露,包括Activity泄露、SQLite泄露、未正确释放的对象等。使能StrictMode通常在Application和Activity的开始处(如onCreate)添加代码使能StrictMod…

    2022年5月2日
  • python将字符串类型转换为数字_把字符串转化为数字

    python将字符串类型转换为数字_把字符串转化为数字MD5工具类,提供字符串MD5加密、文件MD5值获取&lpar;校验&rpar;功能MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能:packagecom.yzu.utils;importjava.io.File;importjava.io.Fi…GUI开发者桌面搜索文件工具#-*-coding:utf-8-*-fromTkint…

    2022年10月12日
  • Java基础之增强型for循环

    Java基础之增强型for循环目录增强型for循环语法:for(ElementTypeelement:arrayName){};增强for循环的原理增强型for循环注意事项增强型for循环语法:for(ElementTypeelement:arrayName){};举个例子:(1)int[]numArray={1,2,3,4,5,6};for(inti:numArray…

    2022年6月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号