rain
2024-05-20 4d1c72b10afcb0c4e7ba3b6caddd29b191ae5870
水印调整
4 files modified
135 ■■■■ changed files
src/main/java/com/dji/sample/patches/controller/PatchesController.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/patches/utils/TimerUtil.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java 50 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java 53 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/patches/controller/PatchesController.java
@@ -76,9 +76,13 @@
    }
    @GetMapping("/useMyTask")
    public ResponseResult useMyTask() throws Exception {
        timerUtil.myTask();
        timerUtil.myTask2();
        return ResponseResult.success();
        try {
//        timerUtil.myTask();
            timerUtil.myTask2();
            return ResponseResult.success();
        }catch (Exception e){
            throw new RuntimeException("db存储发送出现异常");
        }
    }
    /**
     * 根据图斑的地块编号获取相对应音视频
src/main/java/com/dji/sample/patches/utils/TimerUtil.java
@@ -90,7 +90,7 @@
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void myTask() throws Exception {
        String taskId="";
        String taskId = "";
        String workspaceId = "4a574db8-4ad3-48f7-9f16-3edbcd8056e1";
//        获取未规划的图斑集合
        List<List<LotInfo>> lists = getNoPlan();
@@ -109,6 +109,7 @@
            backWayline(multipartFile, waylineName, workspaceId, backclaim().getUsername());
            //将为规划的图斑状态更新为已规划
            updatePatchesStatu(list);
//            waylineJobService.publishFlightTask(JobParam("656c62f4-cb86-4911-930d-b38089829348"),backclaim());
        }
    }
@@ -145,11 +146,10 @@
                //更新媒体文件的是否添加状态
                updateMediaStatu(mediaFile);
            }
            //存储db到服务器
            dbSave(territoryConfigPojo.getResult(), territoryConfigPojo.getResultsave(), taskId);
            //发送请求给第三方接口
            sendPostWithFileAndParameter(territoryConfigPojo.getResult(), taskId);
            //存储db到服务器
            dbSave(territoryConfigPojo.getResult(), territoryConfigPojo.getResultsave(), taskId);
        }
    }
@@ -243,12 +243,13 @@
        long timestamp = System.currentTimeMillis();
        List<List<Long>> listOfLists = new ArrayList<>();
        List<Long> sublist = new ArrayList<>();
        sublist.add(1715852375L); // 添加整数值
        sublist.add(1715941980L); // 添加整数值
        listOfLists.add(sublist);
        List<Long> list = new ArrayList<>();
        list.add(1715852375L);
        list.add(1715941980L);
        CreateJobParam param = new CreateJobParam();
        param.setName("云飞行调查"+timestamp);
        param.setName("云飞行调查" + timestamp);
        param.setExecuteStartTimeArr(listOfLists);
        param.setTaskType(TIMED);
        param.setOutOfControlAction(0);
        param.setRepFreType(3);
@@ -328,12 +329,16 @@
            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
            // 发送请求
                     restTemplate.exchange(
            ResponseEntity<String> response =restTemplate.exchange(
                    "https://jxlandcloud.org.cn/landCloudWork/artifact/media/upload.action",
//                  "http://localhost:6789/territory/tbdkjbxx/upload",
                    HttpMethod.POST,
                    requestEntity,
                    String.class);
            System.out.println(response);
            System.out.println(response);
            System.out.println(response);
            System.out.println(response);
        } catch (Exception e) {
            throw new IllegalArgumentException("db推送失败" + e.getMessage());
        }
@@ -411,4 +416,5 @@
        }
        return folder;
    }
}
src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java
@@ -21,6 +21,8 @@
import javax.xml.crypto.Data;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
@@ -68,9 +70,11 @@
        return count;
    }
    public void   insertOneData(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception {
    public void insertOneData(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception {
        TbFjEntity tbFj = dbConvertToEntity(mediaFile, lotInfo);
        tbFjMapper.insert(tbFj);
        if (tbFj.getFjysgd()==3000){
            tbFjMapper.insert(tbFj);
        }
    }
    @Override
@@ -94,7 +98,7 @@
        Double absoluteAltitude = jsonObject.getDouble("absoluteAltitude");
        Double relativeAltitude = jsonObject.getDouble("relativeAltitude");
        Double gimbalYawDegree = jsonObject.getDouble("gimbalYawDegree");
        Long sj =jsonObject.getLong("createdTime");
        Long sj = jsonObject.getLong("createdTime");
        JSONObject shootPosition = jsonObject.getJSONObject("shootPosition");
        Double lat = shootPosition.getDouble("lat");
        Double lng = shootPosition.getDouble("lng");
@@ -108,8 +112,8 @@
        String zsdm = "23C8CCC61E3042FBA6A658F319337B1A";
        String dklx = "0";
        int fjlx = 1;
        String pstz="Y";
        String pssj=convertTimestampToDateTime(sj);
        String pstz = "Y";
        String pssj = convertTimestampToDateTime(sj);
        String bsm = UUID.randomUUID().toString();
        String fjmc = mediaFile.getFileName();
        String key = mediaFile.getObjectKey();
@@ -123,13 +127,13 @@
        //对应图片和视频文件进行不同处理
        boolean endsWith = key.endsWith(".mp4");
        if (!endsWith) {
            file1 = WaterMarkUtil.addWatermark(file, patchesConfigPojo.getUnzip(), sj, lat, lng,gimbalYawDegree);
            file1 = WaterMarkUtil.addWatermark(file, patchesConfigPojo.getUnzip(), sj, lat, lng, gimbalYawDegree);
            FJ = fileToByteArray(file1);
        } else {
            file1 = VideoZipUtil.compressVideo(file, 800000, 128000, 1280, 720);
            FJ = fileToByteArray(file1);
        }
        String sm3 = Sm3Util.calculateSM3Hash(fjhxz+","+pssj+","+lng+","+lat+","+gimbalYawDegree+","+psjd+","+pshgj+","+psry+","+zsdm);
        String sm3 = Sm3Util.calculateSM3Hash(fjhxz + "," + pssj + "," + lng + "," + lat + "," + gimbalYawDegree + "," + psjd + "," + pshgj + "," + psry + "," + zsdm);
        byte[] hash = sm3.getBytes(); // 注意:使用SM3或其他哈希算法来计算数据的哈希值
        // 加载私钥
@@ -142,10 +146,10 @@
                    .dkbsm(lotInfo.getBsm())
                    .xzqdm(lotInfo.getXzqdm())
                    .dklx(dklx)
                    .xdgd(relativeAltitude)
                    .jdgd(absoluteAltitude)
                    .Latitude(lat)
                    .longitude(lng)
                    .xdgd(truncateToTwoDecimalPlaces(relativeAltitude))
                    .jdgd(truncateToTwoDecimalPlaces(absoluteAltitude))
                    .Latitude(truncateToSevenDecimalPlaces(lat))
                    .longitude(truncateToSevenDecimalPlaces(lng))
                    .fj(FJ)
                    .fjmc(fjmc)
                    .fjlx(fjlx)
@@ -211,6 +215,7 @@
        fis.close();
        return data;
    }
    public static String convertTimestampToDateTime(long timestamp) {
        // 将时间戳转换为 Instant 对象
        Instant instant = Instant.ofEpochMilli(timestamp);
@@ -222,4 +227,25 @@
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return dateTime.format(formatter);
    }
}
    public static Double truncateToTwoDecimalPlaces(Double value) {
        if (value == null) {
            return null;  // 处理null值情况
        }
        BigDecimal bd = new BigDecimal(value).setScale(2, RoundingMode.DOWN);
        return bd.doubleValue();
    }
    public static Double truncateToSevenDecimalPlaces(Double value) {
        if (value == null) {
            return null;  // 处理null值情况
        }
        BigDecimal bd = new BigDecimal(value).setScale(7, RoundingMode.DOWN);
        return bd.doubleValue();
    }
    public static void main(String[] args) {
        System.out.println(truncateToSevenDecimalPlaces(152.00666565));
        System.out.println(truncateToTwoDecimalPlaces(12.006));
    }
}
src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java
@@ -23,8 +23,8 @@
     * @return 添加水印并压缩后的图片文件。
     * @throws IOException 如果读取或保存图片失败。
     */
    public static File addWatermark(File file, String path, Long pssj, Double lat, Double lng, Double angles) throws IOException {
        String author="中图智绘无人机";
    public static File addWatermark(File file, String path, Long pssj, Double lat, Double lng, Double angles) throws IOException, FontFormatException {
        String angel=angle(angles);
        Long timestamp = pssj; // 例如:Unix 时间戳(以秒为单位)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -42,7 +42,7 @@
        // 设置水印文字 "江西调查云"
        String watermarkText = "江西调查云";
        float alpha = 0.7f; // 设置透明度为 0.7
        float alpha = 0.8f; // 设置透明度为 0.7
        AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2d.setComposite(alphaComposite);
        g2d.setFont(new Font("宋体", Font.BOLD, 150)); // 使用宋体字体
@@ -58,11 +58,17 @@
        g2d.setTransform(at);
        // 绘制左上角旋转水印文字
        g2d.drawString(watermarkText, x1, y1);
        alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);
        alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f);
        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);
        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"); // 替换为你的字体文件路径
        Font customFont = Font.createFont(Font.TRUETYPE_FONT, fontFile).deriveFont(36.00F);
        // 注册字体
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(customFont);
        g2d.setFont(customFont);
        // 计算文本宽度和高度
        FontMetrics fm = g2d.getFontMetrics();
        int textWidth = fm.stringWidth(extraInfo);
@@ -71,10 +77,32 @@
        g2d.setTransform(new AffineTransform());
        // 设置文本位置(右下角)
        int x2 = originalImage.getWidth() - textWidth - 30; // 右对齐的 x 坐标
        int y2 = originalImage.getHeight() - textHeight - 68; // 最底部位置 y 坐标
        int y2 = originalImage.getHeight() - textHeight - 30; // 最底部位置 y 坐标
        int rectX = originalImage.getWidth() - textWidth  +530;
        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);
        int rectXs = originalImage.getWidth() - textWidth +450 ;
        int rectYs = originalImage.getHeight() - textHeight  -62;
        // 绘制半透明黑色背景矩形
        g2d.setColor(semiTransparentColor);
        g2d.fillRect(rectXs, rectYs, textWidth, textHeight-10);
//            int rectXw = originalImage.getWidth() - textWidth  +1510 ;
//            int rectYw = originalImage.getHeight() - textHeight -124;
//
//            // 绘制半透明黑色背景矩形
//            g2d.setColor(semiTransparentColor);
//            g2d.fillRect(rectXw, rectYw, textWidth, textHeight-6);
        // 绘制文本信息
        String[] lines = extraInfo.split("\n");
        for (String line : lines) {
            g2d.setColor(Color.WHITE);
            // 计算每行文本的宽度
            int lineWidth = fm.stringWidth(line);
            // 将文本的起始位置设置为图像宽度减去文本的宽度
@@ -84,15 +112,14 @@
        // 释放 Graphics2D 对象
        g2d.dispose();
        // 保存添加水印后的图片
        File outputFile = File.createTempFile("mark", ".jpg");
        File originalImageFiles = new File(outputFile.toURI());
        File outputFile = new File("src/main/copy.jpeg");
        try {
            ImageIO.write(originalImage, "jpg", outputFile);
            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);
        return outputFile; // 返回保存的文件对象
    }
    public static String angle(double angle) {