1.首先需要一个读取ico的jar,链接:https://download.csdn.net/download/airyearth/13218304,
详细demo代码请见 https://blog.csdn.net/airyearth/article/details/110480949
2.读取出来的文件为Image格式还需要可以转为BufferedImage,以备平均哈希算法(相似图片搜索)使用
3.代码读取ico文件:
InputStream in = new FileInputStream("D:\\tmall.ico") ;
ICOFile ico = new ICOFile(in);
java.util.List list = ico.getImages();
Image image = null;
if (!list.isEmpty()) {
image = (Image) list.get(0);
}
4.转为BufferedImage:
public static BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) { return (BufferedImage) image; }
image = new ImageIcon(image).getImage();
boolean hasAlpha = false;
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
int transparency = Transparency.OPAQUE;
if (hasAlpha) { transparency = Transparency.BITMASK; }
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null),
image.getHeight(null), transparency);
} catch (HeadlessException e) {
}
if (bimage == null) {
int type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha) { type = BufferedImage.TYPE_INT_ARGB; }
bimage = new BufferedImage(image.getWidth(null),image.getHeight(null), type);
}
Graphics g = bimage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
5.平均哈希算法:
private static byte[] hashValue(BufferedImage src){
BufferedImage hashImage = resize(src,HASH_SIZE,HASH_SIZE);
byte[] matrixGray = (byte[]) toGray(hashImage).getData().getDataElements(0, 0, HASH_SIZE, HASH_SIZE, null);
return binaryzation(matrixGray);
}
6.相似度比较:
private static float compare(byte[] f1,byte[] f2){
if(f1.length!=f2.length)
throw new IllegalArgumentException("mismatch FingerPrint length");
int sameCount=0;
for(int i=0;i<f1.length;++i){
if(f1[i]==f2[i])++sameCount;
}
return (float)sameCount/f1.length;
}