Java遍历文件夹及图像缩放批处理

记得我以前写过图像处理的文章是用大学里教的数字图像处理来操作,用个Matlab,不过最近实习中和一妹纸起了一点小冲突,双方都没多少时间处理这些资源,然后我是静下心来去思考了,妹纸怎么会花这么多的时间在这一工作上。

然后跑过去沟通,了解她整个工作的流程,果然有所发现,她修改图片大小是用美图来一张一张改的,整个过程花了1个小时,心里灵机一动,批量处理肯定能写,以前做过类似的,但是妹纸没有Matlab。为了解放生产力,我还是晚上时间把东西赶了出来。

首先说一下文件的规定,有多个文件,每个文件有jpg和png这种格式的图片,需要把jpg的规格全部调成600*400规格,针对横屏图片,针对竖屏图片,将分辨率互换,png格式图片调成200*200。

首先是先要指定文件夹,将之前规定好的文件夹放进去。

File f = new File("E://console");
if (!f.exists()) {
   f.mkdir();
}

指定为e盘的console文件夹。有了这个文件夹后,如果文件夹没有文件,是需要给妹纸提个醒的。

if (f.listFiles() == null) {
  System.out.println("E://consolegame 目录下没有游戏");
}

有这个目录之后,遍历文件,寻找以png为后缀的文件。

for (File everyfile : game.listFiles()) {
 if (everyfile.getName().split("\\.")[1].equals("png")) {
<span style="font-size:18px;">  }</span><p><span style="font-size:18px;">}</span></p>

split里面的参数是正则表达式,点是匹配单个字符的意思,所以需要转义字符\,而细心地会发现,其实windows里面的路径为反斜杠,其实输入斜杆访问也可以进行访问。Java中并不能直接识别反斜杠为转义字符,所以需要写成\\。

将文件名和文件类型名瓜分为数组,然后取出所需的文件:

try {
	System.out.println(chinese);
        //BufferedImage为Image的子类 ImageIO的read方法返回为BufferedImage
        BufferedImage image = ImageIO.read(everyfile);

        System.out.println(chinese+"图标png文件已缩放为x*x规格");
//  	System.out.println(image.getWidth());
//	System.out.println(image.getHeight());

        //创建图像的缩放版本,前两个参数分别为图像宽度和高度,最后是图像取样算法
        //Image.SCALE_SMOOTH是图像平滑度比缩放速度更具优先级的算法
        //SCALE_FAST 缩放速度比图像平滑度更具优先级的算法
        Image newimage = image.getScaledInstance(pngwidth, pngheight, Image.SCALE_SMOOTH);

        //构造图像,最后一参数为图像颜色分量为RGB
        BufferedImage board = new BufferedImage(pngwidth, pngheight, BufferedImage.TYPE_INT_RGB);

        //方法返回Graphics2D,为Graphics的子类,其实用createGraphics更方便,为向后兼容考虑
        //用于绘制图像
        Graphics g = board.getGraphics();

        //第一个参数为需要绘制的图像,第二和第三个参数为x和y坐标,第三个参数为图像非透明部分绘制的
        //背景色,最后一个为转换图像需要通知的对象(这个不是很了解)
        g.drawImage(newimage,0,0,Color.white,null);

        //释放资源
        g.dispose();
        //将原文件删除
        everyfile.delete();
	ImageIO.write(board,"png",new File("E://console//"+everyfile.getName()));
} catch (IOException e) {
	e.printStackTrace();
}

图像处理部分,没想到用Java处理起来比Matlab简单,毕竟Matlab是自己直接去操作每个像素了。

剩下的还有jpg格式的,但是处理要根据是竖屏图片还是横屏图片进行分别调整,总不能把横屏的压扁了,竖屏的压矮了。

if (everyfile.getName().split("\\.")[1].equals("jpg")) {
try {
	BufferedImage image = ImageIO.read(everyfile);
	Image newimage = null;
	BufferedImage board = null;
	if(image.getWidth()>image.getHeight()){
		newimage = image.getScaledInstance(jpgwidth, jpgheight, Image.SCALE_SMOOTH);
		board = new BufferedImage(jpgwidth, jpgheight, BufferedImage.SCALE_SMOOTH);
		System.out.println(everyfile.getName()+"素材jpg文件已缩放为x*x");
	}else{
		newimage = image.getScaledInstance(jpgheight,jpgwidth,Image.SCALE_SMOOTH);
		board = new BufferedImage( jpgheight,jpgwidth,BufferedImage.SCALE_SMOOTH);
		System.out.println(everyfile.getName()+"素材jpg文件已缩放为x*x");
	}
	Graphics g = board.getGraphics();
	g.drawImage(newimage,0,0,null);
	g.dispose();
	everyfile.delete();
	ImageIO.write(board,"jpg",new File("E://console//"+everyfile.getName()));
} catch (IOException e) {
	e.printStackTrace();
}

原理与上面相同。

最后的成就感爆棚,妹纸的生产力解放,其实只要在电脑上进行操作,编程的东西基本都能用到。那晚,自己一边傻笑一边走回家。是的,程序员就是会感叹自己的做的东西好牛逼的。

不过Java有Java的局限性所在,当我编译的版本比妹纸运行版本高的时候,问题就来了,这种问题的话,还是用C++更好。

时间: 2024-12-20 04:46:30

Java遍历文件夹及图像缩放批处理的相关文章

java 遍历文件夹里的文件

Java遍历文件夹的2种方法: A.不使用递归: import java.io.File; import java.util.LinkedList; public class FileSystem { public static void main(String[] args) { long a = System.currentTimeMillis(); LinkedList list = new LinkedList(); File dir = new File("c:\\java\\&quo

java遍历文件夹

使用递归: import java.io.File; import java.util.ArrayList; public class FileSystem1 { private static ArrayList filelist = new ArrayList(); public static void main(String[] args) { long a = System.currentTimeMillis(); refreshFileList("C:/Users/shibin/Desk

JAVA 遍历文件夹下的所有文件

JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = 0, folderNum = 0; File file = new File(path); if (file.exists()) { LinkedList<File> list = new LinkedList<File>(); File[] files = file.listFile

Java遍历文件夹下所有文件并替换指定字符串

应用场景:比如有一个深层次的文件目录结构,如:javaAPI 每个文件里面都有相同的内容,而我们要统一修改为其他内容.上千个文件如果一个个修改显得太不明智. import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.PrintWriter; public class Test { /** *

Java遍历文件夹下的所以文件

利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重命名操作 1 package com.zhang.test; 2 3 import java.io.File; 4 5 public class getfilepath { 6 7 public static void main(String[] args) { 8 getDirectory(new

JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)

1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = 0, folderNum = 0; File file = new File(path); if (file.exists()) { LinkedList<File> list = new LinkedList<File>(); File[] files = file.listFiles(); for (File file2 : files)

java遍历文件夹找到所有get方法

import java.io.File; import java.io.IOException; import java.util.Scanner; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.io.FileOutputStream; import java.io.PrintWriter; import java.io.PrintStream; import java.io.FileNot

JAVA 遍历文件夹下文件并更改文件名称

周末因为一些原因,需要批量更改一些文件的名称,使其随机,就随手写了点代码. 增加一个随机字母: public static void changeName(String path){ File file = new File(path); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if(files[i].isDirectory()){ changeName(files[i].toString

java 遍历文件夹所有文件和文件夹

final static void showAllFiles(File dir) throws Exception{ File[] fs = dir.listFiles(); for(int i=0; i<fs.length; i++){ if(fs[i].isFile()){ System.out.println(fs[i].getAbsolutePath()); getWidth(fs[i].getAbsolutePath()); }else{ try{ showAllFiles(fs[i]