src/main/java/com/whyc/controller/MaterialController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/MaterialService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/util/DwgToPngUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/util/ImageDiff.java | ●●●●● 补丁 | 查看 | 原始文档 | 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"); } }