**************************************************************************************************************************************
前一段时间项目进入维护阶段之后,工作也不是很忙,不过没清闲几天,Boss就找我有任务了,让把项目中图片文件夹中的图片循环遍历,并判断,如果图片不是方形的,先裁剪成方形的;然后,判断图片大于300kb的话,压缩到300kb。
想了一下,也不需要界面,直接创建Java工程,在main里面实现就可以了。
直接贴代码了:
a.遍历图片文件夹:
static void showAllFiles(String path) {
File root = null;
try {
root = new File(path);
if (root.exists()) { //D:/test/temp
File[] files = root.listFiles(); //三个文件夹
if (files.length == 0) {
System.out.println("文件夹是空的!");
return;
} else {
//遍历图片文件夹
for (File file : files) {
if (file.isDirectory()) {
//文件夹里面含有子文件夹
showAllFiles(file.getAbsolutePath());
// 得到该指定目录下的所有文件
} else {
//文件夹里面不含有子文件夹
/*
* System.out.println("显示"+filePath+"下所有子目录"+file.
* getAbsolutePath());
*/
String filePath = ""; // 文件夹下单个文件的路径
String filePicName = ""; // 文件名称
String pictureFormat = "";// 图片的格式
getImgInfo(file.getPath());
}
}
}
} else {
System.out.println("文件不存在!");
}
} catch (Exception e) {
System.out.println(e.toString()); // 空指针
}
b.判断图片形状
判断图片形状的依据就是图片的话宽和高,所以只要获取到图片的width和height,那就很容易判断了。而java又为我们提供了一个使用很方便的图片类BufferedImage ,通过ImageIO.read(File)就可以获取。
public static void getImgInfo(String imgpath) {
String fileName = null; //图片文件名称
String format = null ; //图片转换格式
String tempFilePath = "" ; //临时文件路径
String destFilePath = "" ; //目标文件夹的路径
File tempFile = null ;
String temp[] = imgpath.replaceAll("\\\\", "/").split("/");
//获取图片名称
if (temp.length > 1) {
fileName = temp[temp.length-1];
}
format = fileName.substring(fileName.lastIndexOf(".")).replace(".", "");
if ("jpg".equals(format)||"JPG".equals(format)) {
format = "JPG";
} else if ("png".equals(format)||"PNG".equals(format)){
format = "PNG";
}else if ("bmp".equals(format)||"BMP".equals(format)){
format = "BMP";
}
for (int i = 0; i < temp.length; i++) {
if (i >1&&i
bufferedImage.getHeight()&&fis.available()/1024-300>0) {
size = bufferedImage.getHeight() ;
} else if(bufferedImage.getWidth()>bufferedImage.getHeight()&&fis.available()/1024-300<0){
size = bufferedImage.getHeight() ;
}else if(bufferedImage.getWidth()==bufferedImage.getHeight()&&fis.available()/1024-300>0){
size = bufferedImage.getHeight() ;
}else if(bufferedImage.getWidth()==bufferedImage.getHeight()&&fis.available()/1024-300<=0){
size = bufferedImage.getHeight() ;
}else if(bufferedImage.getWidth()
0){
size = bufferedImage.getWidth() ;
}else if(bufferedImage.getWidth()>bufferedImage.getHeight()&&fis.available()/1024-300==0){
size = bufferedImage.getHeight() ;
}else if(bufferedImage.getWidth()
c.裁剪、等比例压缩
在调试的过程中,发现,由于图片的形状和规定的基本上都不一样,但是如果不在需求300kb的图片,如果裁剪之后,也就会变的符合要求,而如果是方形的图片,压缩之后,也不会影响图片的形状,所以,就用这一个方法一块实现了。
最后将设定好的width、height再次创建BufferedImage,将image对象传入Graphics类,绘制出新的图形,通过ImageIO输出到指定位置即可。
/**
* 改变图片的大小到宽为size,然后高随着宽等比例变化
* @param is 上传的图片的输入流
* @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
* @param size 新图片的宽
* @param format 新图片的格式
* @throws IOException
*/
public static void resizeImage(FileInputStream is, FileOutputStream os, int size, String format) throws IOException {
BufferedImage prevImage = ImageIO.read(is);
double width = prevImage.getWidth();
double height = prevImage.getHeight();
double percent ;
int newWidth ,newHeight;
//宽大于高 传进来的size为小值
if (width>=height) {
percent = size/width;
newWidth = (int)(width * percent);
newHeight = (int) height;
} else {
//宽小于高
percent = size/height;
newWidth = (int)width;
newHeight = (int) (height * percent);
}
BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR);
Graphics graphics = image.createGraphics();
graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null); ImageIO.write(image, format, os); os.flush(); is.close(); os.close(); }
***********************************************************************************************************************************