import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
/**
* 相似图片去重
* 核心功能已完成
* 待改进
* @无法适应所有尺寸图片 标记一
* @相似度目前还是手写的_count属性暂时还没用上 标记二
*/
public class Imageremoval {
public static void main(String[] args) {
ArrayList list =new ArrayList(); /**等待改进 标记一*/
list.add("10,10");
list.add("20,10");
list.add("30,10");
list.add("40,10");
list.add("50,10");
int count =0; /**定义相似度 由于应用场景的不同 本地图片的像素点渲染 可能出现不同 因此需要设置一个相似度 此处数值应小于 list的长度 0为完全一样*/
if (list.size() < count) {
System.out.println("相似度参数设置不符合规格");
}
doImageremoval("C:\\my\\temp\\Screenshots", list, list.size() - count);
}
/**
* 去重方法
*/
public static void doImageremoval(String FilePath, ArrayList RgbList, int count) {
ArrayList list =new ArrayList();
readImgByFormat(FilePath, "png", list); /**数组中存入所有指定格式的图片文件*/
for (int i =0; i < list.size(); i++)/**遍历图片文件*/ {
/**遍历文件夹 list作为需要进行匹配的样本图*/
System.out.println("读取文件" + list.get(i).getName());
String ints1 ="";
/**获取指定像素坐标*/
ArrayList getRgblist =new ArrayList();
for (int j =0; j < RgbList.size(); j++) {
String[] split = RgbList.get(j).toString().split(",");
int x = Integer.parseInt(split[0]);
int y = Integer.parseInt(split[1]); /**获取需要获取像素数值的坐标*/
ints1 =readRGB(list.get(i), x, y); /**得到结果*/
getRgblist.add(ints1);
}/**得到样本图RGBList*/
/**读取匹配图*/
for (int k =0; k < list.size(); k++) {
ArrayList rootList =new ArrayList();
rootList.addAll(getRgblist);
ArrayList getRgblist2 =new ArrayList();
String ints2 ="";
for (int j =0; j < RgbList.size(); j++) {
String[] split2 = RgbList.get(j).toString().split(",");
int x = Integer.parseInt(split2[0]);
int y = Integer.parseInt(split2[1]); /**获取需要获取像素数值的坐标*/
ints2 =readRGB(list.get(k), x, y); /**得到结果*/
getRgblist2.add(ints2);
}/**得到匹配图RGBL*/
rootList.removeAll(getRgblist2);
if (rootList.size() <2 && !list.get(i).getName().equals(list.get(k).getName()))/**罗列的像素点特征匹配 并且样本图与匹配图 不是同一个文件*/ {/**标记二*/
System.out.println("删除文件" + list.get(k).getName());
list.get(k).delete();
}
}
readImgByFormat(FilePath, "png", list); /**数组中存入所有指定格式的图片文件 刷新文件夹*/
}
}
/**
* 读取文件夹内的所有图片
*/
public static void readImgByFormat(String FilePath, String ForMat, ArrayList FileList) {
FileList.removeAll(FileList); /**清空*/
File file =new File(FilePath); /**读取文件夹*/
File[] files = file.listFiles(); /**获取文件夹内的所有内容*/
for (int i =0; i < files.length; i++) {
boolean equals = files[i].getName().contains("." + ForMat.toLowerCase()) || files[i].getName().contains("." + ForMat.toUpperCase());/**是否包含指定的后缀*/
if (equals) {
FileList.add(files[i]);
}/**符合索引条件 加入集合*/
}
System.out.println("本次索引 得到结果个数--" + FileList.size());
}
/**
* --------------读取图片RGB 返回单个像素点的RGB值
*
* @param imagefile 读取文件
* @param x 横坐标
* @param y 纵坐标
*/
public static StringreadRGB(File imagefile, int x, int y) {
int[] rgb =new int[3];
BufferedImage bi =null;
try {
bi = ImageIO.read(imagefile);
}catch (Exception e) {
e.printStackTrace();
}finally {
}
int pixel = bi.getRGB(x, y); // 下面三行代码将一个数字转换为RGB数字
rgb[0] = (pixel &0xff0000) >>16;
rgb[1] = (pixel &0xff00) >>8;
rgb[2] = (pixel &0xff);
return rgb[0] +"," + rgb[1] +"," + rgb[2];
}
}