whycxzp
2022-09-16 e56b9ed421f0825130bcd14137e2482470e19327
更新图纸对比
2个文件已添加
2个文件已修改
315 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/MaterialController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/MaterialService.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/DwgToPngUtil.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/ImageDiff.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/MaterialController.java
@@ -5,6 +5,7 @@
import com.whyc.service.MaterialService;
import com.whyc.util.ActionUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.springframework.beans.factory.annotation.Autowired;
@@ -83,4 +84,10 @@
        List<MultipartFile> multipartFileList = Arrays.asList(file);
        return service.addAttachment(multipartFileList,material);
    }
    @ApiModelProperty("物料图纸对比")
    @GetMapping("dwgCompare")
    public Response dwgCompare(@RequestParam int materialId,@RequestParam int materialId2) throws IOException {
        return service.dwgCompare(materialId,materialId2);
    }
}
src/main/java/com/whyc/service/MaterialService.java
@@ -1,7 +1,6 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@@ -11,24 +10,25 @@
import com.whyc.pojo.DocUser;
import com.whyc.pojo.Material;
import com.whyc.pojo.ProductBom;
import com.whyc.util.ActionUtil;
import com.whyc.util.CommonUtil;
import com.whyc.util.DateUtil;
import com.whyc.util.FileUtil;
import com.whyc.util.Zip4jUtil;
import com.whyc.util.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
@Service
@@ -430,4 +430,43 @@
        return new Response().set(1,true,"上传完成");
    }
    public Response dwgCompare(int materialId, int materialId2) throws IOException {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = servletRequestAttributes.getResponse();
        //获取各自物料的图纸
        String dwgUrl = mapper.selectById(materialId).getDwgUrl();
        String dwgUrl2 = mapper.selectById(materialId2).getDwgUrl();
        if(dwgUrl == null || dwgUrl2 == null){
            return new Response().set(1,false,"无法对比,所选物料至少有1个不存在图纸");
        }
        String dwgFileStr = CommonUtil.getProjectDir() + File.separator + dwgUrl;
        String dwgFileStr2 = CommonUtil.getProjectDir() + File.separator + dwgUrl2;
        String absoluteDwgPngPath = dwgFileStr.substring(0,dwgFileStr.lastIndexOf("."))+"-dwg.png";
        String absoluteDwgPngPath2 = dwgFileStr2.substring(0,dwgFileStr2.lastIndexOf("."))+"-dwg.png";
        if(!new File(absoluteDwgPngPath).exists()){
            DwgToPngUtil.dwg2png(new File(dwgFileStr));
        }
        if(!new File(absoluteDwgPngPath2).exists()) {
            DwgToPngUtil.dwg2png(new File(dwgFileStr2));
        }
        ByteArrayOutputStream stream = ImageDiff.compareImages(absoluteDwgPngPath, absoluteDwgPngPath2);
        String fileName = "name.png";
        OutputStream toClient = null;
        try {
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition","attachment;filename=" + fileName);
            toClient = response.getOutputStream();
            toClient.write(stream.toByteArray());
            toClient.flush();
            toClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
src/main/java/com/whyc/util/DwgToPngUtil.java
New file
@@ -0,0 +1,73 @@
package com.whyc.util;
import com.aspose.cad.Color;
import com.aspose.cad.Image;
import com.aspose.cad.fileformats.cad.CadDrawTypeMode;
import com.aspose.cad.imageoptions.CadRasterizationOptions;
import com.aspose.cad.imageoptions.PngOptions;
import com.aspose.cad.imageoptions.UnitType;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@Slf4j
public class DwgToPngUtil {
    public static String dwg2png(File dwgFile) throws IOException {
        FileInputStream fileInputStream;
        //将dwg文件转换成InputStream输入流
        fileInputStream = new FileInputStream(dwgFile);
        Image objImage = Image.load(fileInputStream);
        CadRasterizationOptions rasterizationOptions = new  CadRasterizationOptions();
        //设置颜色
        rasterizationOptions.setBackgroundColor(Color.getBlack());
        int width = objImage.getWidth();
        int height = objImage.getHeight();
        int zoom = 1008000 / width / height;
        rasterizationOptions.setPageWidth(width*zoom);
        rasterizationOptions.setPageHeight(height*zoom);
        //rasterizationOptions.setPageWidth(1400);
        //rasterizationOptions.setPageHeight(650);
        //rasterizationOptions.setAutomaticLayoutsScaling(true);
        //rasterizationOptions.setNoScaling (false);
        //rasterizationOptions.setDrawType(1);
        rasterizationOptions.setDrawType(CadDrawTypeMode.UseObjectColor);
        rasterizationOptions.setDrawColor(Color.getBlue());
        rasterizationOptions.setUnitType(UnitType.Unitless);
        PngOptions pngOptions = new PngOptions();
        pngOptions.setCompressionLevel(0);
        pngOptions.setVectorRasterizationOptions(rasterizationOptions);
        //输出文件
        File outputFile = new File(dwgFile.getParent()+File.separator+dwgFile.getName().substring(0,dwgFile.getName().lastIndexOf("."))+"-dwg.png");
        //存放地址
        try {
            objImage.save(outputFile.getPath(), pngOptions);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("dwg转pdf失败{}",dwgFile.getName());
        } finally {
            fileInputStream.close();
        }
        //log.info("文件转换成功{}",dwgFile.getName());
        return outputFile.getAbsolutePath();
    }
    public static void main(String[] args) throws IOException {
        String s = DwgToPngUtil.dwg2png(new File("C:\\Users\\29550\\Desktop\\当前项目\\202207图纸管理\\图纸升级\\fgcd-80030nt-701_a01.dwg"));
        System.out.println(s);
        //DwgToPngUtil.dwg2Pdf(new File("C:\\Users\\29550\\Desktop\\当前项目\\202207图纸管理\\图纸升级\\fgcd-80030nt-701_a02.dwg"));
        //DwgToPngUtil.dwg2Pdf(new File("C:\\Users\\29550\\Desktop\\当前项目\\202207图纸管理\\图纸升级\\fgcd-80030nt-702_a01.dwg"));
        //DwgToPngUtil.dwg2Pdf(new File("C:\\Users\\29550\\Desktop\\当前项目\\202207图纸管理\\图纸升级\\fgcd-80030nt-702_a02.dwg"));
        //DwgToPngUtil.dwg2Pdf(new File("C:\\Users\\29550\\Desktop\\当前项目\\202207图纸管理\\图纸升级\\fgcd-80030nt-703_a01.dwg"));
        //DwgToPngUtil.dwg2Pdf(new File("C:\\Users\\29550\\Desktop\\当前项目\\202207图纸管理\\图纸升级\\fgcd-80030nt-703_a02.dwg"));
    }
}
src/main/java/com/whyc/util/ImageDiff.java
New file
@@ -0,0 +1,178 @@
package com.whyc.util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
public class ImageDiff {
//不同的像素标记为红色
    public static final int RGB_RED = 16711680;
    //public static final int RGB2 = 02550;
    //允许的Red,Green,Blue单个维度的像素差值
    public static final int DIFF_ALLOW_RANGE = 0;
    //public static final int DIFF_ALLOW_RANGE = 125;
//不同像素点统计值
    public static int diffPointCount = 0;
//从rgb值中抽取red
    public static int getRed(int rgbValue) {
        return rgbValue & 0xff0000 >> 16;
    }
//从rgb值中抽取green
    public static int getGreen(int rgbValue) {
        return rgbValue & 0xff00 >> 8;
    }
//从rgb值中抽取blue
    public static int getBlue(int rgbValue) {
        return rgbValue & 0xff;
    }
    /**
     * 修改BufferedImage中的图片尺寸,以便和源图片进行比较
     *
     * @param image
     * @param newHeight
     * @param newWidth
     * @return
     */
    public static BufferedImage changeImageSize(BufferedImage image, int newHeight, int newWidth) {
        Image img = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
        int width = img.getWidth(null);
        int height = img.getHeight(null);
        //获取新图片的BufferedImage实例
        BufferedImage newBufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_ARGB);
        Graphics g = newBufferedImage.getGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();
        return newBufferedImage;
    }
    /**
     * 比较两图片,并用红色标出不同的像素点,然后保存差异图片到本地,打印匹配率
     *
     * @param srcImgPath
     * @param targetImgPath
     */
    public static ByteArrayOutputStream compareImages(String srcImgPath, String targetImgPath) throws IOException {
        try {
            BufferedImage srcImg = ImageIO.read(new File(srcImgPath));
            BufferedImage targetImg = ImageIO.read(new File(targetImgPath));
            diffPointCount = 0;
            BufferedImage diffImg = srcImg;
            int srcHeight = srcImg.getHeight();
            int srcWidth = srcImg.getWidth();
            //修改待比较图片的尺寸以适应源图片的尺寸
            targetImg = changeImageSize(targetImg, srcHeight, srcWidth);
            /*int w2 = 554;
            int h2 = 487;
            int srcRgb2;
            int targetRgb2;
            srcRgb2 = srcImg.getRGB(w2, h2);
            targetRgb2 = targetImg.getRGB(w2, h2);
            int red = getRed(srcRgb2);
            int red1 = getRed(targetRgb2);
            int green = getGreen(srcRgb2);
            int green1 = getGreen(targetRgb2);
            int blue = getBlue(srcRgb2);
            int blue1 = getBlue(targetRgb2);
            if (Math.abs(red - red1) > DIFF_ALLOW_RANGE ||
                    Math.abs(green - green1) > DIFF_ALLOW_RANGE ||
                    Math.abs(blue - blue1) > DIFF_ALLOW_RANGE) {
                diffImg.setRGB(w2, h2, RGB_RED);
            }*/
            int srcRgb;
            int targetRgb;
            for (int h = 0; h < srcHeight; h++) {
                for (int w = 0; w < srcWidth; w++) {
                    srcRgb = srcImg.getRGB(w, h);
                    targetRgb = targetImg.getRGB(w, h);
                    /*if (Math.abs(getRed(srcRgb) - getRed(targetRgb)) > DIFF_ALLOW_RANGE ||
                            Math.abs(getGreen(srcRgb) - getGreen(targetRgb)) > DIFF_ALLOW_RANGE ||
                            Math.abs(getBlue(srcRgb) - getBlue(targetRgb)) > DIFF_ALLOW_RANGE) {
                        diffImg.setRGB(w, h, RGB_RED);
                        diffPointCount++;
                    }
                }*/
                if (Math.abs(targetRgb - srcRgb) > DIFF_ALLOW_RANGE) {
                    diffImg.setRGB(w, h, RGB_RED);
                }
                diffPointCount++;
            }
        }
        //保存差异图片
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        //ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
        //ImageIO.write(diffImg, "png", new File("diffImg.png"));
        ImageIO.write(diffImg,"png",bs);
        /*//计算相似度(保留小数点后四位)
        int totalPixel = srcHeight * srcWidth;
        DecimalFormat decimalFormat = new DecimalFormat("#.####");
        double matchRate = (totalPixel - diffPointCount) / (totalPixel * 1.0);
        System.out.println("图片相似度为: " + decimalFormat.format(matchRate) + "%");*/
        return bs;
    } catch(Exception ex){
        ex.printStackTrace();
        return null;
    }
}
    public static void main(String[] args) throws IOException {
        compareImages("C:\\\\Users\\\\29550\\\\Desktop\\\\当前项目\\\\202207图纸管理\\\\图纸升级\\\\fbo-60010nt-t-j-002_a11-dwg.png",
                "C:\\\\Users\\\\29550\\\\Desktop\\\\当前项目\\\\202207图纸管理\\\\图纸升级\\\\fbo-60010nt-t-j-002_a12-dwg.png");
    }
}