封装文字信息并增加文字
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; }