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);
    }

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 深入理解STL库_STL文件格式的工作原理

    深入理解STL库_STL文件格式的工作原理关注本人公众号,获取更多学习资料!

    2022年10月16日
  • 非常好用的上位机软件(功能强大)——匿名四轴上位机「建议收藏」

    非常好用的上位机软件(功能强大)——匿名四轴上位机「建议收藏」提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言随着单片机开发,调试工具就必不可少,本文就介绍匿名四轴上位机的基础知识。提示:以下是本篇文章正文内容,下面案例可供参考一、什么是上位机上位机是指可以直接发出操控命令的计算机,一般是PC/hostcomputer/mastercomputer/uppercomputer,屏幕上显示各种信号变化(.

  • LMDB使用说明_ldd教程

    LMDB使用说明_ldd教程http://rayz0620.github.io/2015/05/25/lmdb_in_caffe/官方的extract_feature.bin很好用,但是输出的特征是放在LMDB里的。以前嫌LMDB麻烦,一直都图方便直接用ImageDataLayer来读原始图像。这次绕不过去了,就顺便研究了一下Caffe对LMDB的使用,一些心得写下来和大家分享一下。提取特征的内容下一篇再写。

  • java实现redis分布式锁实例[通俗易懂]

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里以跳转到教程java实现redis分布式锁应用场景:多并发特点:分布式锁、动态解决由redis宕机产生死锁的情况,基于wait()、notify()有效提高效率节省资源Junit类,其中testTryLock包含多线…

  • sqlyog激活成功教程版安装_sqlyog是什么软件

    sqlyog激活成功教程版安装_sqlyog是什么软件百度云:链接:http://pan.baidu.com/s/1eSMEzIE密码:ubi2转载于:https://www.cnblogs.com/haxianhe/p/9271097.html

  • idea2021.8.3激活码永久(JetBrains全家桶)「建议收藏」

    (idea2021.8.3激活码永久)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~Z9LZO4ZKWA-eyJsaWNlbnNlSWQiOi…

发表回复

您的电子邮箱地址不会被公开。

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