import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.net.URL; /** * @ClassName ImageDiff * @Description * @Author 17838625030@163.com * @Date 2023/5/5 13:50 * @Version 1.0 */ public class ImageDiff { public static int[] getData(String signImagePath) { try { BufferedImage img; String[] https1 = signImagePath.split("http"); if(https1.length > 1){ URL url = new URL(signImagePath); img = ImageIO.read(url); }else{ File file = new File(signImagePath); if (!file.exists()) { System.err.println(""+signImagePath+" 该文件不存在!"); } img = ImageIO.read(new File(signImagePath)); } BufferedImage slt = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); slt.getGraphics().drawImage(img, 0, 0, 100, 100, null); // ImageIO.write(slt,"jpeg",new File("slt.jpg")); int[] data = new int[256]; for (int x = 0; x < slt.getWidth(); x++) { for (int y = 0; y < slt.getHeight(); y++) { int rgb = slt.getRGB(x, y); Color myColor = new Color(rgb); int r = myColor.getRed(); int g = myColor.getGreen(); int b = myColor.getBlue(); data[(r + g + b) / 3]++; } } // data 就是所谓图形学当中的直方图的概念 return data; } catch (Exception exception) { System.out.println("有文件没有找到,请检查文件是否存在或路径是否正确"); return null; } } public static float compare(int[] s, int[] t) { try { float result = 0F; for (int i = 0; i < 256; i++) { int abs = Math.abs(s[i] - t[i]); int max = Math.max(s[i], t[i]); result += (1 - ((float) abs / (max == 0 ? 1 : max))); } return (result / 256) * 100; } catch (Exception exception) { return 0; } } public static void main(String[] args) throws Exception { float percent = compare(getData("C:\\Users\\Administrator\\Pictures\\**.jpg"), getData("C:\\Users\\Administrator\\Pictures\\**.jpg")); if (percent == 0) { System.out.println("无法比较"); } else { System.out.println("两张图片的相似度为:" + percent + "%"); } } }