我的个人电脑里最占空间的就是电影和照片了,照片整理来整理去,存在不少重复的,就想着能不能写段代码找到那些重复的照片。
原理比较简单粗暴,就是遍历所有的照片,计算MD5,MD5一样的就是重复的~
用Java写的,顺便练习一下Java~
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Collection; import java.util.HashMap; public class Main { private static String PHOTO_PATH = "D:\\照片"; private static String[] extensions = {"jpg"}; private static HashMap<String, File> hashMap = new HashMap<>(); public static void main(String[] args) throws IOException { Collection files = FileUtils.listFiles( new File(PHOTO_PATH), extensions, true); for (File file : files) { FileInputStream fis = new FileInputStream(file); String md5 = DigestUtils.md5Hex(fis); checkSame(md5, file); fis.close(); } System.out.println("Job done!"); } private static void checkSame(String md5, File file) { if (hashMap.containsKey(md5)) { System.out.println(String.format("%-150s", hashMap.get(md5).getAbsolutePath()) + " -- " + file.getAbsolutePath()); } else { hashMap.put(md5, file); } } }
有些照片太大了,我会用FSResizer(神器,推荐一下)调整分辨率,让文件变小一点。调整前后的两张照片其实是一样的,但是计算MD5的方法就不适用了。
这样的问题需要通过计算两张照片的汉明距离来解决,代码较多,就不贴在博客里了,请移步我的GitHub