JAVA 处理图片(检索,分类)
2017/12/18 14:40:41
解剖 APP 获取里面所有的图片,分类
京东里面png图片 头3千多张
根据分辨率分类
递归遍历目录
- 代码
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MaoShenFileUtil {
// 存放文件路径的集合
private static List<String> filelist = new ArrayList<>();
/**
* 遍历目录的所有文件
* 参数: 文件的路径
* @param filepath
* @return
*/
public static List<String> traverse(String filepath) {
// 创建文件对象
File file = new File(filepath);
//判断文件是否存在
if (file.exists()) {
// 获取文件数组
File[] files = file.listFiles();
//遍历数组中的所有文件
for (File f : files) {
//判断文件是否隐藏
if (f.isHidden()) {
// 重新开始遍历
continue;
}
//如果是文件夹,递归调用自己
if (f.isDirectory()) {
// 传入路径
traverse(f.getPath());
}
// 添加如集合
filelist.add(f.getPath());
}
}
return filelist;
}
}
获取图片的分辨率
- 代码
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.channels.FileChannel;
public class MaoShenImageUtil {
public static int[] Resolution(String filepath) {
// 文件对象
File file = new File(filepath);
FileChannel fc = null;
if (file.exists() && file.isFile()) {
try {
FileInputStream fs = new FileInputStream(file);
fc = fs.getChannel();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
// 读取图片的宽度 (分辨率)
int width = bi.getWidth();
// 读取图片的高度 (分辨率)
int height = bi.getHeight();
// 返回数组 (宽度 高度)
return new int[]{width, height};
}
}
创建对应的文件夹
- 代码
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MaoShenTest1 {
public static void main(String[] args) {
// 所有图片的路径
List<String> list = MaoShenFileUtil.traverse("D:\\BaiduNetdiskDownload\\JD\\img\\png");
// 输出有多少张图片
System.out.println(list.size());
// 图片文件分辨率的集合
List<String> allsize = new ArrayList<>();
// 遍历集合
for (String str : list) {
// 获取分辨率
int[] resolution = MaoShenImageUtil.Resolution(str);
// 拼接字符串
String size = resolution[0] + "-" + resolution[1];
//判断集合里面是否有当前大小的类型
if (!allsize.contains(size)) {
//没有添加
allsize.add(size);
}
}
// 循环创建对应的文件夹
for (String size : allsize) {
// 文件对象
File file = new File("D:\\BaiduNetdiskDownload\\JD\\ms\\png\\" + size);
// 创建文件夹
file.mkdirs();
}
}
}
拷贝图片
- 代码(判断像素)
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.channels.FileChannel;
public class MyImageUtil {
public static boolean isResolution(String filepath, int width, int height) {
File file = new File(filepath);
FileChannel fc = null;
if (file.exists() && file.isFile()) {
try {
FileInputStream fs = new FileInputStream(file);
fc = fs.getChannel();
//System.out.println(fc.size() + "-----fc.size()");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//System.out.println(file.length() + "-----file.length B");
// System.out.println(file.length() * 1024 + "-----file.length kb");
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int w = bi.getWidth();
int h = bi.getHeight();
//System.out.println("宽:像素-----" + width + "高:像素" + height);
if (w == width && h == height) {
return true;
}
return false;
}
}
- 代码 (拷贝)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
public class MaoShenTest2 {
public static void main(String[] args) {
// 所有文件的路径
List<String> list = MaoShenFileUtil.traverse("D:\\BaiduNetdiskDownload\\JD\\img\\png");
//遍历
for (String str : list) {
// 获取分辨率
int[] resolution = MaoShenImageUtil.Resolution(str);
//拼接字符串
String s = resolution[0] + "-" + resolution[1];
//判断像素是否相等
boolean resolution1 = MyImageUtil.isResolution(str, resolution[0], resolution[1]);
//判断
if (resolution1) {
try {
// 文件
File file = new File(str);
//文件读取流
FileInputStream fis = new FileInputStream(file);
//文件输出流
FileOutputStream fos = new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\JD\\ms\\png\\" + s + "\\" + file.getName()));
int len = 0;
byte[] buf = new byte[1024 * 8];
while ((len = fis.read(buf)) != -1) {
//写入
fos.write(buf, 0, len);
}
// 关闭
fos.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}