关于后端:java添加图片水印

3次阅读

共计 1891 个字符,预计需要花费 5 分钟才能阅读完成。

封装文字信息并增加文字

    List<ImageDTO> list = new ArrayList<>();
    list.add(createImageDTO("测试水印"+ "KG",  // 文字内容
                        new Color(255, 0, 0, 255),  // 色彩及透明度
                        new Font("微软雅黑", Font.PLAIN, 24),  // 字体
                        0.6d,  // 横坐标地位
                        0.1d   // 纵坐标地位
    ));

    // 通过网络 url 获取图片 file
    String url = "https://.......";
    File srcImgFile = URLToFile(url, fileName);
    // 调用增加文字
    BufferedImage file = setWatermarkTask(srcImgFile, list);

可间接传入 xy 坐标地位,本文已改为传入百分比并通过图片宽高计算

 /**
  * 增加水印
  */
  private BufferedImage setWatermarkTask(File srcImgFile, List<ImageDTO> list) {
        try {Image srcImg = ImageIO.read(srcImgFile);// 文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);// 获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);// 获取图片的高
            // 增加文字:
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);

            for (ImageDTO imgDTO : list) {g.setColor(imgDTO.getColor());                                  // 依据图片的背景设置水印色彩
                g.setFont(imgDTO.getFont());                                    // 设置字体
                g.drawString(imgDTO.getText(), Math.round(imgDTO.getX() * (double) srcImgWidth), Math.round(imgDTO.getY() * (double) srcImgHeight));   // 画出水印
            }
            g.dispose();
            return bufImg;
        } catch (Exception e) {throw new RuntimeException(e);
        }
    }



  /**
   * 创立 ImageDTO, 每一个对象, 代表在该图片中要插入的一段文字内容:
   *
   * @param text  : 文本内容;
   * @param color : 字体色彩 (前三位) 和透明度(第 4 位, 值越小, 越通明);
   * @param font  : 字体的款式和字体大小;
   * @param x     : 以后字体在该图片地位的横坐标;
   * @param y     : 以后字体在该图片地位的纵坐标;
   * @return
   */
  private ImageDTO createImageDTO(String text, Color color, Font font, Double x, Double y) {ImageDTO imageDTO = new ImageDTO();
        imageDTO.setText(text);
        imageDTO.setColor(color);
        imageDTO.setFont(font);
        imageDTO.setX(x);
        imageDTO.setY(y);
        return imageDTO;
    }



    /**
     * 读取网络中的图片
     */
    private File URLToFile(String url, String fileName) {File file1 = new File(fileName);
        try {URL url1 = new URL(url);
            FileUtils.copyURLToFile(url1, file1);

        } catch (IOException e) {e.printStackTrace();
        }
        File absoluteFile = file1.getAbsoluteFile();
        return file1;
    }

文字详情实体类

    @Data
    public class ImageDTO {
        // 文字内容
        private String text;
        // 字体色彩和透明度
        private Color color;
        // 字体和大小
        private Font font;
        // 所在图片的 x 坐标百分比
        private Double x;
        // 所在图片的 y 坐标百分比
        private Double y;
    }
正文完
 0