前言
一个朋友被绿了,看见绿色就会很伤感,作为好兄弟的我当然看不下去,感觉有我必要也必须做一点什么。正好我又在写java程序,那就写一个小程序帮他把电脑里的图片排一下顺序,根据绿色的程度进行排序,最后把排好序的图片偷偷的放到他的电脑里去。为了好兄弟做这么多的事情,正所谓:事了拂衣去,功藏身与名啊!(当然是倒序排的)
一、利用for循环读取图片
相信学过图像处理的小伙伴都知道,一张图片由很多像素组成(当然,矢量图片除外,大家下来可以了解为啥矢量图片不是由像素点组成的)。因此,不管是什么图片我们都看作是一个平面,因为就可以用坐标的方式去读取图片啦!那就废话不多说直接开始!
二、代码的逻辑
1.先给大家看看主方法里面都有一些什么内容
public static void main(String[] args) {
HashMap<File, Object> imageMap = new HashMap<File, Object>();//用hashMap将文件和对应的像素点数量装到一起
File fileDir = new File("D:\\Download\\TestFile");//将要进行排序的文件目录
File[] listFiles = fileDir.listFiles();
for (File readFile : listFiles) {
getImagePixel(readFile, imageMap);//获取图片的绿色像素点数量的多少
}
HashMapSortUtils hashMapSortUtils = new HashMapSortUtils(imageMap, 1, 3, "Mus");
LinkedHashMap<File,Object> sortFileMap = hashMapSortUtils.sortFileMap();//将图片按照像素点的数量进行排序
hashMapSortUtils.renameFiles(sortFileMap);//将排好序的文件重命名(不然离开控制台就看不到文件的排序了>o<)
System.out.println(imageMap);//这里只是用来看具体像素点有多少的,并没有实际的意义
}
是不是很简单呢?跟大象装冰箱一样,只有三个步骤:
1.将文件目录下的所有图片含有的绿色像素点全部读取出来,然后将对应的文件名和像素点个数暂存在HashMap里;
2.将图片根据绿色像素点的多少进行排序;
3.将排好序的图片重命名,然后进行排序输出(Tips:文件会进行重命名的,所有不要直接在源文件上直接玩喔,注意文件的备份);
好了,那我们就直接开始看每个方法具体是怎样实现的吧,按顺序进行讲解!(以下大家就注意看代码中的注释了,不再做重复的解释了)
2.读取图片像素点的方法
private static HashMap<File, Object> getImagePixel(File readFile, HashMap<File, Object> imageMap) {
int red = 0;//记录像素点的红色
int green = 0;//记录像素点的绿色
int blue = 0;//记录像素点的蓝色
int counter = 0;//程序计数器
BufferedImage bi = null;
try {
bi = ImageIO.read(readFile);//通过ImageIO来读取图片,以便获取图片的RGB信息
} catch (IOException e) {
e.printStackTrace();
}
int width = bi.getWidth();//获取图片的宽度
int height = bi.getHeight();//获取图片的高度
int minx = bi.getMinX();//获取图片的坐标起点x轴
int miny = bi.getMinY();//获取图片的坐标起点y轴
for(int i = minx; i < width; i++){
for(int j = miny; j < height; j++){
int pixel = bi.getRGB(i, j);
red = (pixel & 0xff0000) >> 16;//过滤掉图片的绿色和蓝色
green = (pixel & 0xff00) >> 8;//过滤掉图片的绿色
blue = (pixel & 0xff);//最后剩下的就是蓝色啦
if(green - red > 30 && green - blue > 30){//绿色的范围
counter++;
}
}
}
imageMap.put(readFile, counter);//将文件和像素点的个数记录到HashMap中
return imageMap;
}
3.将图片按照像素点的数量进行排序
由于排序不光在这里可以使用,在其他情况下也可能会使用到(比如说根据文件的创建时间进行排序,都可以用到排序的)。所以我将排序写成了一个抽象类,其他情况下只需要继承这个抽象类,然后具体实现自己想要实现的方法就行了!具体的现如下:
抽象类:
package readcolor;
import java.io.File;
import java.util.HashMap;
import java.util.LinkedHashMap;
public abstract class HashMapSortUtil {
private HashMap<File, Object> sortMap;//全局变量Map,就是主方法需要传过来进行排序的Map
private String prefix;//前缀,用来命名自己的文件 ==> Mus
public abstract LinkedHashMap<File, Object> sortFileMap();//进行排序的方法
public abstract void renameFiles(LinkedHashMap<File, Object> linkedTimeMap);//重命名的方法
public HashMap<File, Object> getSortMap() {
return sortMap;
}
public void setSortMap(HashMap<File, Object> sortMap) {
this.sortMap = sortMap;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
}
&jc(Ё |