粗略介绍ImageIO
ImageIO是javax.imageio包下的一个类,用于实现Java中关于图片输入输出的一种类,这个类中所有方法均为静态方法,因此调用时直接使用ImageIO.methodName() 即可.
相对于使用FileInputStream这类的节点流,使用ImageIO能真真正正的改变图片的格式而不只是修改图片的后缀名称.
当初看到了ImageIO能真正改变图片格式,因此想着要是以后需要改变图片的格式就不用专门去找某个网站修改了自己就能改还挺方便的就花了十分钟大致研究了一下比较重要的read和write函数,接下来介绍一下这两个函数.
static boolean write(RenderedImage im, String formatName, File output)
使用支持给定格式的任意 ImageWriter写入图像到 File 。
static BufferedImage read(File input)
返回 BufferedImage作为供给的解码结果 File与 ImageReader选自目前登记的那些自动选择。
还有其他重载,就不列出了,我是用的是比较简单的版本.
本问的代码用于访问某个文件夹下的图片群,并将某一后缀名称(如jpg)的图片选出,之后转换到另一文件夹中以另一图片格式保存(如png)
一、遍历文件夹
这一部分比较简单,先判断输入的路径是文件还是文件夹,如果是文件夹则列举出文件夹中所有某一后缀图片,如果是文件,那么就直接转换该文件为另一格式(此处的文件是指图片).
/** * 遍历文件夹文件 * @param srcPath 原图路径 * @param destPath 新图路径 * @param formatName 图片格式,支持bmp|gif|jpg|jpeg|png * @return */ public static void traverseFile(String srcPath, String destPath,String formatToChange,String formatName) { boolean flag; File file=new File(srcPath); if (file.isFile()) { modifyImageFormat(srcPath,destPath+"."+formatName,formatName); System.out.println("转换单张图片,格式为"+formatName); }else{//文件是一个文件夹 File[] files = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if (pathname.getAbsolutePath().endsWith(formatToChange)) { return true; } else { return false; } } }); for (File file1 : files) { String name=file1.toString().substring(file1.toString().lastIndexOf("\\") ,file1.toString().lastIndexOf(".")); //第一种使用定位符号的方式 // String[] split = file1.toString().split("\\\\"); // String[] split1 = split[split.length - 1].split("\\."); // System.out.println(Arrays.toString(split1)); // System.out.println(Arrays.toString(split)); // flag= modifyImageFormat(file1.toString(), destPath+split[split.length-1], formatName); // flag= modifyImageFormat(file1.toString(), destPath+split1[0]+"."+formatName, formatName); flag= modifyImageFormat(file1.toString(), destPath+name+"."+formatName, formatName); if(flag){ System.out.println(file1.toString()+"转换成功!"); }else{ System.out.println(file1.toString()+"转换失败"); } } } }
二、转换图片格式
首先使用ImageIO.read方法读取图片所在位置,读取图片后该方法将返回一个BufferImage对象,Image是一个抽象类,BufferedImage是其实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。
正是由于BufferImage这一特性,使得我们可以简易的对图片进行修改.
之后使用ImageIO.write方法将缓冲区图片写入到指定路径,需要定义为文件的格式.
需要注意write方法的第一个参数是RenderedImage接口,因此我们需要一个实现该接口的是是实现类,而read方法的返回值BufferImage对象正是这个接口的实现类.
/** * 修改原图的文件格式 * @param srcPath 原图路径 * @param destPath 新图路径 * @param formatName 图片格式,支持bmp|gif|jpg|jpeg|png * @return true/false */ public static boolean modifyImageFormat(String srcPath, String destPath, String formatName) { boolean flag = false; try { BufferedImage bufferedImg = ImageIO.read(new File(srcPath)); flag = ImageIO.write(bufferedImg, formatName, new File(destPath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } return flag; } public static void main(String[] args) { traverseFile("D:\\图片","D:\\123\\","jpg","png");//转换某一文件夹的图片 traverseFile("D:\\1b147b5a54e639ec362a07afdff758b.jpg", "D:\\新图片","jpg","png");//转换单张图片 }