Java实现图片格式转换(通过ImageIO)

简介: Java实现图片格式转换(通过ImageIO)

粗略介绍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");//转换单张图片
        }

视频效果演示

视频


相关文章
|
2月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
91 4
|
2月前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
65 2
|
2月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
53 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
6月前
|
数据可视化 Java
Java语言使用DL4J实现图片分类
【6月更文挑战第14天】Java语言使用DL4J实现图片分类
119 3
|
2月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
142 1
|
2月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
25 1
|
2月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
106 1
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
141 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
3月前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
|
3月前
|
存储 缓存 监控
Java——图片文件位于 bin 目录下,下载新图片会导致应用程序重启
【9月更文挑战第22天】在Java应用中,若图片位于bin目录下且下载新图片导致应用重启,可能是因为部署方式不当或资源监控机制过于敏感。解决方法包括:更改图片存储位置至独立目录;配置应用服务器减少资源监控敏感度;使用独立资源服务器托管静态资源;优化代码减少资源重复加载。具体方案需根据应用实际情况和技术栈调整。