java根据图片中绿色像素点的多少进行排序

论坛 期权论坛 脚本     
niminba   2021-5-23 05:02   2232   0

前言

一个朋友被绿了,看见绿色就会很伤感,作为好兄弟的我当然看不下去,感觉有我必要也必须做一点什么。正好我又在写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(Ё
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP