使用背景:

加入你有一堆的图片,有一天你想整理一下,想删除重复或者相似度较高的图,自己手动又太累太耗时...

主类:

import com.sun.jna.platform.FileUtils;
import tool.PublicWays;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;public class DeleteDuplicateImg {private static File txtFile;private static String foreachFolder;public DeleteDuplicateImg(File file, String downloadUrl) {if (file != null)txtFile = file;else {txtFile = new File("DownloadImageLog.txt");//为空或仅执行当前类时指定创建txt文件PublicWays.creatFile(txtFile);}if (downloadUrl != null)foreachFolder = downloadUrl;else {System.out.println("请选择需要操作的文件夹");foreachFolder = PublicWays.selectSavePath(txtFile);//当为空或仅执行当前类时拉起选择需要遍历的文件夹}init();}private static void init() {/*创建日志文本文件*/String txtName = "Log.txt";String savePath = "";txtFile = new File(savePath + txtName);PublicWays.creatFile(txtFile);PublicWays.modifyFileContents(txtFile, "\n" + PublicWays.getCurrentTime("yyyy-MM-dd HH:mm:ss") + "\n\n", false);FileUtils fileUtils = FileUtils.getInstance();File file = new File(foreachFolder);File[] files = file.listFiles();assert files != null;System.out.println("文件夹内文件数量:" + files.length);long startTime, endTime;startTime = System.currentTimeMillis();ArrayList<int[]> filesList = new ArrayList<>();for (File f : files) {filesList.add(getData(f));}ArrayList<File> duplicateFileList = new ArrayList<>();endTime = System.currentTimeMillis();System.out.println("转化二进制添加至数组耗时: " + (endTime - startTime) + "ms");compare(filesList, files, duplicateFileList);//开始遍历delete(duplicateFileList, fileUtils);//开始删除重复文件endTime = System.currentTimeMillis();System.out.println("总耗时: " + (endTime - startTime) + "ms");}static BufferedImage img, slt;/*** 将图片转成二进制** @param file 需要转存的图片* @return 返回二进制数组*/public static int[] getData(File file) {try {img = ImageIO.read(file);slt = new BufferedImage(100, 100,BufferedImage.TYPE_INT_RGB);slt.getGraphics().drawImage(img, 0, 0, 100, 100, null);int[] data = new int[256];int r, g, b, rgb, x, y;//避免重复定义,循环前先全部定义完Color myColor;for (x = 0; x < slt.getWidth(); x++) {for (y = 0; y < slt.getHeight(); y++) {rgb = slt.getRGB(x, y);myColor = new Color(rgb);r = myColor.getRed();g = myColor.getGreen();b = myColor.getBlue();data[(r + g + b) / 3]++;}}return data;} catch (Exception exception) {System.out.println("出错啦!");return null;}}/*** 对比两张图片的相似度** @param s 第一张图* @param t 第二张图* @return 返回相似度*/public static float compare(int[] s, int[] t) {try {float result = 2F;int i, abs, max;assert s != null;assert t != null;for (i = 0; i < 256; i++) {abs = Math.abs(s[i] - t[i]);max = Math.max(s[i], t[i]);result += (1 - ((float) abs / (max == 0 ? 1 : max)));}return (result / 256) * 100;} catch (Exception exception) {return 0;}}/*** 遍历数组,开始对比相似度** @param filesList      需要对比相似度文件夹对应转存的二进制数组* @param files          需要对比相似度文件夹* @param duplicateFiles 用于存储重复的图片数组*/private static void compare(ArrayList<int[]> filesList, File[] files, ArrayList<File> duplicateFiles) {long startTime, endTime;startTime = System.currentTimeMillis();float percent;int num = 0, i, j;for (i = 4; i < filesList.size(); i++) {if (files[i].exists()) {for (j = i + 1; j < filesList.size(); j++) {percent = compare(filesList.get(i), filesList.get(j));if (percent >= 90 && files[j].exists()) {duplicateFiles.add(files[j]);}num++;}} elseSystem.out.println(files[i] + " is not exit!");}endTime = System.currentTimeMillis();System.out.println("对比图片耗时: " + (endTime - startTime) + "ms");PublicWays.modifyFileContents(txtFile, "对比图片" + num + "次, 共耗时: " + (endTime - startTime) + "ms" + "\n", true);}/*** 删除重复图片** @param duplicateFileList 需要删除的重复图片数组* @param fileUtils         为避免误操作,用于将图片扔至回收站*/private static void delete(ArrayList<File> duplicateFileList, FileUtils fileUtils) {long startTime, endTime;startTime = System.currentTimeMillis();try {for (File f : duplicateFileList) {if (f.exists()) {fileUtils.moveToTrash(new File[]{f});PublicWays.modifyFileContents(txtFile, " 删除图片 " + f.getName(), true);}}} catch (IOException ignored) {}endTime = System.currentTimeMillis();System.out.println("删除图片耗时: " + (endTime - startTime) + "ms");PublicWays.modifyFileContents(txtFile, "删除" + duplicateFileList.size() + "张图片, 共耗时: " + (endTime - startTime) + "ms" + "\n", true);}public static void main(String[] args) {new DeleteDuplicateImg(null, null);}}

PublicWays类:

     /*** 修改指定文件的内容* --分割线--* FileWriter第二个参数true意为续写,false或不写则为覆盖** @param file     需要修改内容的文件* @param info     修改的内容* @param isAppend 选择是覆写还是续写,true为续写,false为覆写*/public static void modifyFileContents(File file, String info, Boolean isAppend) {try {FileWriter fileWriter = new FileWriter(file, isAppend);fileWriter.write(info);fileWriter.flush();fileWriter.close();} catch (IOException e) {e.printStackTrace();System.out.println("写入指定" + file.getName().substring(file.getName().lastIndexOf(".") + 1) + "文件内容出错:" + e.getMessage());}}/*** 获取当前时间并自定义格式化** @param format 自定义格式化格式(yyyy:年 MM:月 dd:日 HH:时 mm:分 ss:秒)*/public static String getCurrentTime(String format) {return new SimpleDateFormat(format).format(new Date());}/*** 在指定路径创建指定文件** @param file 需要创建的txt文件*/public static void creatFile(File file) {if (!file.exists()) {try {file.createNewFile();System.out.println("创建指定" + file.getName().substring(file.getName().lastIndexOf(".") + 1) + "文本文件成功!");} catch (IOException e) {e.printStackTrace();System.out.println("创建指定" + file.getName().substring(file.getName().lastIndexOf(".") + 1) + "文本文件出错:" + e.getMessage());}} else {System.out.println("指定" + file.getName().substring(file.getName().lastIndexOf(".") + 1) + "文本文件已存在!");}}

删除文件夹内的重复图片相关推荐

  1. java 自动删除文件夹,定时删除文件及文件夹 java 定时删除文件夹内所有文件

    如何定时删除电脑里某个文件夹里的东西 例如我要删除C:\Program Files\大话西游OnlineII\D3DX9_43.dll编写个代在记事本创建一个bat小脚本,输入@echo offdel ...

  2. PHP实现删除文件夹内的文件的功能

    PHP实现文件夹内的文件删除功能,大多会用到unlink这个函数.如果要删除指定的文件直接unlink(文件地址),如果要删除一个文件夹内的所有文件,肯定要遍历文件夹,或者找到一个函数能够知道文件夹内 ...

  3. python操作文件夹-Python文件操作大全,随机删除文件夹内的任意文件

    在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法: os.path.abspath(path) #返回绝对路径 os.path.basename(path ...

  4. python 删除文件夹_Python文件操作大全,随机删除文件夹内的任意文件

    在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法: os.path.abspath(path) #返回绝对路径 os.path.basename(path ...

  5. python删除文件夹内打不开的图片

    在windows系统上,从网上爬了一些图片,传到linux系统,有些图片被损坏,需要删除这些打不开的图片. import os import cv2 from glob import glob ima ...

  6. python批量实现将文件夹内的每张图片分割成多张

    一.说在前面 需求:有一张长为960,宽为96的图片,需要将其分割成10张96*96的图片并存放在另外一个文件夹下,通过手工分割耗时且不规范,选择python写一个简单的程序完成. 二.源码 # -* ...

  7. python图片批量重命名文件夹_python3_learn 实现文件夹内批量对图片重命名

    初衷 练习Python,提高动手能力. 珍藏的壁纸文件夹名命有点乱. 可以学习下一些基础的库 开始(.jpg,无筛选) First 首先找到OS库,寻找可以遍历文件名的.找到了OS.walk() os ...

  8. python删除文件夹里损坏的图片

    今天学习pytoch时发现有好多图片损坏了 报错如下: PIL.UnidentifiedImageError: cannot identify image file <_io.BufferedR ...

  9. python 根据时间间隔删除文件夹内修改时间比较早的文件

    import os import time import datetime def fileremove(filename, timedifference):#getmtime获取文件的修改时间dat ...

最新文章

  1. 从5G入池看AI发展新方向 | 杜克大学陈怡然教授专访
  2. 一款轻量级的桌面WebServer通讯组件
  3. 准确率99%!基于深度学习的二进制恶意样本检测——瀚思APT 沙箱恶意文件检测使用的是CNN,LSTM TODO...
  4. Spring AbstractBeanFactory
  5. protocol buffer介绍(protobuf)
  6. 项目中遇到问题的解决方法合集
  7. python win7 sp1_[ Python - 15 ] win7安装paramiko问题总汇
  8. CodeChef - DGCD——树链剖分+差分
  9. LINUX学习笔记共五部分
  10. 百度SEO站群Emlog最新付费模板带会员 做资源网不错
  11. JavaScript 浏览器对象BOM
  12. 说说windows10自带浏览器Edge的好与不好
  13. LeetCode 343. 整数拆分(动态规划)
  14. MongoDB的ObjectId生成原理
  15. Machine Learning---LMS 算法
  16. PyCharm导入selenium的webdirver模块出错
  17. C++STL算法equal(15)
  18. Drop Shipment PO以及Replenishment PO有何异同?
  19. 在线代理浏览国外网站_知道这些在线PS网站,设计再也不求人
  20. python大牛_成为Python大牛必须要掌握的高端语法——yield

热门文章

  1. 编程中的燕尾槽刀具该如何加工设置
  2. 【论文阅读】S2A-Net
  3. FileZilla Server源码解析之LIST命令
  4. 3. 类指针与智能指针
  5. MATLAB | MATLAB海洋、气象数据colormap配色补充包(NCL color tables)
  6. 50个html+css+js项目小练习(二:动画的倒计时效果)
  7. tp5 mysql读写分离_tp5主从数据库设置读写分离
  8. 微信小程序自定义组件Component is not found in path components weimo tabbar index using by pages index inde
  9. Ubuntu 下 安装 RabbitVCS 教程
  10. 依托 axios 实现全局请求防抖