package com.dji.sample.territory.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import static com.dji.sample.territory.utils.ImgZipUtil.compressImageAndGetFile; public class WaterMarkUtil { /** * 将图片加上水印并压缩 * * @param file * @param path * @param pssj * @param lat * @param lng * @return 添加水印并压缩后的图片文件。 * @throws IOException 如果读取或保存图片失败。 */ public static File addWatermark(File file, String path, Long pssj, Double lat, Double lng, Double angles) throws IOException { String author="机巢"; String angel=angle(angles); Long timestamp = pssj; // 例如:Unix 时间戳(以秒为单位) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timestamp)))); File originalImageFile = new File(file.toURI()); BufferedImage originalImage; try { originalImage = ImageIO.read(originalImageFile); } catch (IOException e) { throw new IllegalArgumentException("读取图片失败" + e.getMessage()); } // 创建 Graphics2D 对象以在图像上绘制水印 Graphics2D g2d = originalImage.createGraphics(); // 设置水印文字 "国土调查云" String watermarkText = "江西调查云"; float alpha = 0.5f; // 设置透明度为 0.5 AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2d.setComposite(alphaComposite); g2d.setFont(new Font("宋体", Font.BOLD, 100)); // 使用宋体字体 FontMetrics fms = g2d.getFontMetrics(); int textHeights = fms.getHeight(); // 设置水印位置(左居中) int x1 = 100; // 左边距离图片左边缘的距离 int y1 = (originalImage.getHeight() - textHeights) / 2; // 垂直居中 // 旋转35度角 double angle = Math.toRadians(35); AffineTransform at = AffineTransform.getRotateInstance(angle, x1, y1); g2d.setTransform(at); // 绘制左上角旋转水印文字 g2d.drawString(watermarkText, x1, y1); alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f); g2d.setComposite(alphaComposite); String extraInfo = String.format("%s\nlon:%.9f lat:%.6f\n%s 时间:%s", author,lng, lat,angel,sd); g2d.setFont(new Font("宋体", Font.BOLD, 50)); // 使用宋体字体,更小的字号 g2d.setBackground(Color.black); // 计算文本宽度和高度 FontMetrics fm = g2d.getFontMetrics(); int textWidth = fm.stringWidth(extraInfo); int textHeight = fm.getHeight(); // 恢复坐标系到正常状态(不旋转) g2d.setTransform(new AffineTransform()); // 设置文本位置(右下角) int x2 = originalImage.getWidth() - textWidth - 30; // 右对齐的 x 坐标 int y2 = originalImage.getHeight() - textHeight - 65; // 最底部位置 y 坐标 // 绘制文本信息 String[] lines = extraInfo.split("\n"); for (String line : lines) { // 计算每行文本的宽度 int lineWidth = fm.stringWidth(line); // 将文本的起始位置设置为图像宽度减去文本的宽度 g2d.drawString(line, x2 + textWidth - lineWidth, y2); y2 += g2d.getFontMetrics().getHeight(); // 增加行高 } // 释放 Graphics2D 对象 g2d.dispose(); // 保存添加水印后的图片 File outputFile = File.createTempFile("mark", ".jpg"); File originalImageFiles = new File(outputFile.toURI()); try { ImageIO.write(originalImage, "jpg", outputFile); } catch (IOException e) { throw new IllegalArgumentException("水印图片保存失败"); } float compressionQuality = 0.5f; // 0.0 - 1.0, higher value means better quality return compressImageAndGetFile(originalImageFiles, compressionQuality); } public static String angle(double angle) { if (angle > 0 && angle < 45) { return "北偏东"; } if (angle > 45 && angle < 90) { return "东偏北"; } if (angle > 90 && angle < 135) { return "东偏南"; } if (angle > 135 && angle < 180) { return "南偏东"; } if (angle > -45 && angle < 0) { return "北偏西"; } if (angle > -90 && angle < -45) { return "西偏北"; } if (angle > -135 && angle < -90) { return "西偏南"; } if (angle > -180 && angle < -135) { return "南偏西"; } if (angle == 0) { return "正北"; } if (angle == 90) { return "正东"; } if (angle == 180|| angle == -180) { return "正南"; } if (angle == -90) { return "正西"; } return "未知"; } }