rain
2024-08-21 2db1aa88e8ab53096a936163d686b90d8e056a99
src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java
@@ -1,5 +1,9 @@
package com.dji.sample.territory.utils;
import com.dji.sample.media.service.IFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
@@ -8,24 +12,23 @@
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.dji.sample.territory.utils.ImgZipUtil.compressImageAndGetFile;
@Component
public class WaterMarkUtil {
    @Autowired
    private IFileService fileService;
    /**
     * 将图片加上水印并压缩
     *
     * @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, FontFormatException {
        String angel=angle(angles);
    public static File addWatermark(File file, Long pssj, Double lat, Double lng, Double angles, int type) throws IOException, FontFormatException {
        double anglses = convertAngle(angles);
        String angel = angle(anglses);
        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))));
@@ -36,12 +39,15 @@
        } catch (IOException e) {
            throw new IllegalArgumentException("读取图片失败" + e.getMessage());
        }
//        fileService.saveMarkFile(lotInfo.getWorkspaceId(),mediaFile,file1);
        // 创建 Graphics2D 对象以在图像上绘制水印
        Graphics2D g2d = originalImage.createGraphics();
        // 设置水印文字 "江西调查云"
        String watermarkText = "江西调查云";
        if (type == 1){
            watermarkText = "国土调查云";
        }
        float alpha = 0.8f; // 设置透明度为 0.7
        AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2d.setComposite(alphaComposite);
@@ -51,7 +57,7 @@
        // 设置水印位置(左居中)
        int x1 = 600; // 左边距离图片左边缘的距离
        int y1 = (originalImage.getHeight() - textHeights) -800; // 垂直居中
        int y1 = (originalImage.getHeight() - textHeights) - 800; // 垂直居中
        // 旋转35度角
        double angle = Math.toRadians(50);
        AffineTransform at = AffineTransform.getRotateInstance(angle, x1, y1);
@@ -60,9 +66,9 @@
        g2d.drawString(watermarkText, x1, y1);
        alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f);
        g2d.setComposite(alphaComposite);
        String extraInfo = String.format("Lon:%.9f Lat:%.6f\n%s 时间:%s", lng, lat,angel,sd);
        File fontFile = new File("src/main/java/com/dji/sample/territory/utils/MiSans-Normal.ttf"); // 替换为你的字体文件路径
        String extraInfo = String.format("Lon:%.7f Lat:%.7f\n%s %s", lng, lat, angel, sd);
        File fontFile = new File("/usr/share/fonts/MiSans-Normal.ttf"); // 替换为你的字体文件路径
//        File fontFile = new File("src/main/resources/MiSans-Normal.ttf"); // 替换为你的字体文件路径
        Font customFont = Font.createFont(Font.TRUETYPE_FONT, fontFile).deriveFont(36.00F);
        // 注册字体
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
@@ -80,18 +86,18 @@
        int y2 = originalImage.getHeight() - textHeight - 30; // 最底部位置 y 坐标
        int rectX = originalImage.getWidth() - textWidth  +530;
        int rectY = originalImage.getHeight() - textHeight -15;
        int rectX = originalImage.getWidth() - textWidth + 490;
        int rectY = originalImage.getHeight() - textHeight - 15;
        // 绘制半透明黑色背景矩形
        Color semiTransparentColor = new Color(0, 0, 0, 156); // 0-255 的 alpha 值,0 表示完全透明,255 表示完全不透明
        g2d.setColor(semiTransparentColor);
        g2d.fillRect(rectX, rectY, textWidth, textHeight-6);
        g2d.fillRect(rectX, rectY, textWidth, textHeight - 6);
        int rectXs = originalImage.getWidth() - textWidth +450 ;
        int rectYs = originalImage.getHeight() - textHeight  -62;
        int rectXs = originalImage.getWidth() - textWidth + 420;
        int rectYs = originalImage.getHeight() - textHeight - 62;
        // 绘制半透明黑色背景矩形
        g2d.setColor(semiTransparentColor);
        g2d.fillRect(rectXs, rectYs, textWidth, textHeight-10);
        g2d.fillRect(rectXs, rectYs, textWidth, textHeight - 10);
//            int rectXw = originalImage.getWidth() - textWidth  +1510 ;
//            int rectYw = originalImage.getHeight() - textHeight -124;
@@ -112,7 +118,8 @@
        // 释放 Graphics2D 对象
        g2d.dispose();
        // 保存添加水印后的图片
        File outputFile = new File("src/main/copy.jpeg");
        File outputFile = File.createTempFile("mark", ".jpg");
        try {
            ImageIO.write(originalImage, "jpg", outputFile); // 将图像写入临时文件
        } catch (IOException e) {
@@ -135,30 +142,58 @@
        if (angle > 135 && angle < 180) {
            return "南偏东";
        }
        if (angle > -45 && angle < 0) {
        if (angle > 315 && angle < 360) {
            return "北偏西";
        }
        if (angle > -90 && angle < -45) {
        if (angle > 270 && angle < 315) {
            return "西偏北";
        }
        if (angle > -135 && angle < -90) {
        if (angle > 225 && angle < 270) {
            return "西偏南";
        }
        if (angle > -180 && angle < -135) {
        if (angle > 180 && angle < 225) {
            return "南偏西";
        }
        if (angle == 0) {
        if (angle == 45) {
            return "东北";
        }
        if (angle == 135) {
            return "东南";
        }
        if (angle == 225) {
            return "西南";
        }
        if (angle == 315) {
            return "西北";
        }
        if (angle == 0 || angle == 360) {
            return "正北";
        }
        if (angle == 90) {
            return "正东";
        }
        if (angle == 180|| angle == -180) {
        if (angle == 180) {
            return "正南";
        }
        if (angle == -90) {
        if (angle == 270) {
            return "正西";
        }
        return "未知";
    }
    public static double convertAngle(double angle) {
        // 处理负数角度,将其转换为正数
        if (angle < 0) {
            angle += 360;
        }
        return angle;
    }
    public static void main(String[] args) {
        // 测试不同的输入角度
        double[] testAngles = {25};
        for (double angle : testAngles) {
            System.out.printf("输入角度: %.1f, 转换后的方位角: %.1f\n", angle, convertAngle(angle));
        }
    }
}