Graphics2D繪製多圖片水印方法

還有一篇文章添加多種水印(文字水印(帶背景顏色) +圖片水印)大家可以看一下、
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);
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章