ke
2024-05-15 57d2bd4cf146db02abe2182fc5242a3c06cbdd74
全景图更新切图功能kl  5-15 16
5 files modified
121 ■■■■■ changed files
skjcmanager/skjcmanager-ops/skjcmanager-resource/src/main/java/cn/gistack/resource/feign/OssClient.java 3 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/controller/SkPanoramaController.java 103 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/entity/SkPanoramaEntity.java 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/utils/Img4JavaUtil.java 4 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/utils/PanoramaUtilDict.java 6 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-ops/skjcmanager-resource/src/main/java/cn/gistack/resource/feign/OssClient.java
@@ -104,12 +104,13 @@
                String link = bladeFile.getLink();
                // 临时图片上传完成后删除临时文件
                // 格式化后的临时图片上传完成后删除临时文件
                if (qietufile.exists()) {
                    // 删除指定文件,不存在报异常
                    FileUtils.forceDelete(qietufile);
                }
                item.setLinshiUrl(link);
            }
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/controller/SkPanoramaController.java
@@ -36,6 +36,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.im4java.core.IM4JavaException;
import org.im4java.core.InfoException;
import org.springblade.core.secure.BladeUser;
@@ -102,7 +103,9 @@
    @GetMapping("/list")
    @ApiOperation(value = "分页", notes = "传入skPanorama")
    public R<IPage<SkPanoramaVO>> list(SkPanoramaEntity skPanorama, Query query) {
        IPage<SkPanoramaEntity> pages = skPanoramaService.page(Condition.getPage(query), Condition.getQueryWrapper(skPanorama));
        QueryWrapper<SkPanoramaEntity> queryWrapper = Condition.getQueryWrapper(skPanorama);
        queryWrapper.orderBy(true,false,"res_guid","sort" );
        IPage<SkPanoramaEntity> pages = skPanoramaService.page(Condition.getPage(query), queryWrapper);
        return R.data(SkPanoramaWrapper.build().pageVO(pages));
    }
@@ -178,7 +181,24 @@
    @PostMapping("/submit")
    @ApiOperation(value = "新增或修改", notes = "传入skPanorama")
    public R submit(@Valid @RequestBody SkPanoramaEntity skPanorama) {
        if (skPanorama.getId() == null  ) { // 新增
            if  (StringUtils.isBlank(skPanorama.getPicUrl())) {
                skPanorama.setStatus(PanoramaUtilDict.panorama_status_0);
            }
            picIfFormate(skPanorama);
        } else { // 修改
            picIfFormate(skPanorama);
        }
        return R.status(skPanoramaService.saveOrUpdate(skPanorama));
    }
    private SkPanoramaEntity picIfFormate(SkPanoramaEntity skPanorama) {
        Integer picwidth = skPanorama.getPicwidth();
        Integer picheight = skPanorama.getPicheight();
        if (picwidth == picheight * 2) {
            skPanorama.setStatus(PanoramaUtilDict.panorama_status_2);
        }
        return skPanorama;
    }
    /**
@@ -262,28 +282,6 @@
        // 获取文件名
        String dirPath = linShiBaseUrl + resGuid + "/"; //临时文件夹路径
        String lingshiPic = linShiBaseUrl + resGuid + "/" + picName; //临时文件
//        File dir = new File(dirPath);
//        if (dir.isDirectory()) {
//            // 清除该目录下的文件及子目录文件而不删除该目录文件夹。该目录不存在会报错
//            FileUtils.cleanDirectory(dir);
//        } else {
//            dir.mkdirs();
//        }
//        // 线上全景图路径,下载到临时路径
//        URL url = new URL(picUrl);
//        InputStream inputStream = url.openStream();
//        OutputStream outputStream = new FileOutputStream(lingshiPic);
//        byte[] buffer = new byte[4096];
//        int bytesRead;
//        while ((bytesRead = inputStream.read(buffer)) != -1) {
//            outputStream.write(buffer, 0, bytesRead);
//        }
//        inputStream.close();
//        outputStream.close();
//        Path lingshiqjPath = Paths.get(lingshiPic);
//        File lingshiqjfile = lingshiqjPath.toFile(); // 获取临时全景文件,准备切图
        File lingshiqjfile = getquanjingFile(dirPath,lingshiPic,entity);
@@ -397,19 +395,19 @@
     * 将图片转化为长宽比为2:1的比例
     */
    private static final String  linShiformateBaseUrl = "/data/panorama/formate/";
    @GetMapping("/formatePic")
    public R  formatePic(ParamEntity param) throws IOException, InterruptedException, IM4JavaException {
        List<String> idlist = param.getSkPanoramaIdList();
    @PostMapping("/formatePic")
    public R  formatePic(@RequestParam String ids) throws IOException, InterruptedException, IM4JavaException {
        List<Long> idlist = Func.toLongList(ids);
        ArrayList<SkPanoramaEntity> panoramalist = new ArrayList<SkPanoramaEntity>();
        ArrayList<FormateTuEntity> list = new ArrayList<FormateTuEntity>();
        if (idlist!= null && idlist.size()>0) {
            for (String id : idlist ) {
            for (Long id : idlist ) {
                FormateTuEntity formateTuEntity = new FormateTuEntity();
                SkPanoramaEntity skPanorama = new SkPanoramaEntity();
                skPanorama.setId(Long.valueOf(id));
                skPanorama.setId(id);
                SkPanoramaEntity entity = skPanoramaService.getOne(Condition.getQueryWrapper(skPanorama));
                String picUrl = entity.getPicUrl();
                String picName = entity.getPicName();
@@ -419,30 +417,52 @@
                String dirPath = linShiformateBaseUrl + resGuid + "/"; //临时文件夹路径
                String lingshiPic = linShiformateBaseUrl + resGuid + "/" + picName; //临时文件
                String lingshigeshibiliPic = linShiformateBaseUrl + resGuid + "/geshibili/" + picName; //格式化后的临时文件
                String lingshigeshibilipath = linShiformateBaseUrl + resGuid + "/geshibili/" ;
                String lingshigeshibiliPic = lingshigeshibilipath + picName; //格式化后的临时文件
                File lingshiqjfile = getquanjingFile(dirPath,lingshiPic,entity);
                // 创建文件夹
                File lingshigeshibilidir = new File(lingshigeshibilipath);
                if (lingshigeshibilidir.isDirectory()) {
                    // 清除该目录下的文件及子目录文件而不删除该目录文件夹。该目录不存在会报错
                    FileUtils.cleanDirectory(lingshigeshibilidir);
                } else {
                    lingshigeshibilidir.mkdirs();
                }
                /**************进行格式化******************/
                // 获取原始全景图图片信息
                HashMap<String, Integer> imgInfoRT = Img4JavaUtil.getImgInfoRT(lingshiqjfile);
                Integer width = imgInfoRT.get("width");
                Integer height = imgInfoRT.get("height");
                if (width == height * 2) {
                    // 已经符合格式化标准
                } else {
                    Integer newWidth = height * 2;
                    // 图片格式化
                    Img4JavaUtil.sampleImg(lingshiPic,lingshigeshibiliPic, newWidth , height,null);
                Integer newWidth = height * 2;
                Img4JavaUtil.resizeImg(lingshiPic,lingshigeshibiliPic, newWidth , height);
                    Path lingshiformPath = Paths.get(lingshigeshibiliPic);
                    File lingshiformFile = lingshiformPath.toFile(); // 获取临时全景文件
                    if(lingshiformFile.exists()) {
                        formateTuEntity.setPicName(picName);
                        formateTuEntity.setId(Long.toString(id));
                        formateTuEntity.setResGuid(resGuid);
                        formateTuEntity.setLinshiUrl(lingshigeshibiliPic);
                        formateTuEntity.setPicheight(height);
                        formateTuEntity.setPicwidth(newWidth);
                        list.add(formateTuEntity);
                    }
                    // 完成格式化后删除原始临时图片
                    Path qietuPath = Paths.get(lingshiPic);
                    File yuanspic = qietuPath.toFile();
                    if (yuanspic.exists()) {
                        // 删除指定文件,不存在报异常
                        FileUtils.forceDelete(yuanspic);
                    }
                Path lingshiformPath = Paths.get(lingshigeshibiliPic);
                File lingshiformFile = lingshiformPath.toFile(); // 获取临时全景文件
                if(lingshiformFile.exists()) {
                    formateTuEntity.setPicName(picName);
                    formateTuEntity.setId(id);
                    formateTuEntity.setResGuid(resGuid);
                    formateTuEntity.setLinshiUrl(lingshigeshibiliPic);
                    formateTuEntity.setPicheight(height);
                    formateTuEntity.setPicwidth(newWidth);
                    list.add(formateTuEntity);
                }
            } // for循环结束
@@ -453,7 +473,6 @@
            Object data = r.getData();
            QieTuEntity result = JSONObject.parseObject(JSONObject.toJSONString(data),QieTuEntity.class);
            ArrayList<FormateTuEntity> newList = result.getList();
            if (newList != null && newList.size()>0) {
                for (FormateTuEntity item : newList) {
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/entity/SkPanoramaEntity.java
@@ -19,6 +19,7 @@
import cn.gistack.sm.skPanoramaState.entity.SkPanoramaStateEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -80,6 +81,7 @@
     * 拍摄时间
     */
    @ApiModelProperty(value = "拍摄时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date shootingTime;
    /**
     * 全景图拍摄角度
@@ -125,6 +127,9 @@
     * 原始全景图片长
     */
    private Integer  picwidth;
    @TableField(exist = false)
    private String  fbl;
    /**
     * 原始全景图片,切图的列数
     */
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/utils/Img4JavaUtil.java
@@ -31,7 +31,7 @@
            System.out.println("------------ END 初始化ImageMagickPath -------------");
        } else if (OSinfo.isLinux()) {
            System.out.println("------------ START 初始化ImageMagickPath -------------");
//            ProcessStarter.setGlobalSearchPath("D:/im4java/ImageMagick-7.1.1-Q16-HDRI");
            System.out.println("------------ END 初始化ImageMagickPath -------------");
        }
    }
@@ -298,7 +298,7 @@
     * @throws InterruptedException
     * @throws IM4JavaException
     */
    public void sampleImg(String inImgPath,String outImgPath,Integer width,Integer height,String editType) throws IOException, InterruptedException, IM4JavaException{
    public static void sampleImg(String inImgPath,String outImgPath,Integer width,Integer height,String editType) throws IOException, InterruptedException, IM4JavaException{
        ConvertCmd cmd = new ConvertCmd();
        IMOperation operation = new IMOperation();
        operation.addImage(inImgPath);
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/utils/PanoramaUtilDict.java
@@ -3,6 +3,12 @@
public class PanoramaUtilDict {
    /**
     * 全景图上传状态
     * 0,异常
     */
    public static final Integer panorama_status_0 = 0;
    /**
     * 全景图上传状态
     * 1,已上传
     */
    public static final Integer panorama_status_1 = 1;