rain
2024-05-14 5c288f2960d4256e1a5cfff37dcc976e62bd86ce
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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 "未知";
    }
}