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

2023-11-13

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

在这里插入图片描述

视频效果演示

视频

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现图片格式转换(通过ImageIO) 的相关文章

随机推荐

  • sql查询无结果返回空_Java Mybaties In查询无法返回结果映射对象

    问题描述 在Springboot mybaties mapper xml下 使用in查询参数由Java后台拼接字符串而来 执行查询后 Java后台收到的响应结果为null 但是将sql放至数据库查询时 发现能查到数据 列表未完全展示 最终效
  • 【刷题笔记4】LeetCode 82. 删除排序链表中的重复元素 II (链表处理经典题目)

    系列索引 刷题笔记0 系列目录索引 持续更新 推荐收藏 本题题目 LeetCode 82 删除排序链表中的重复元素 II 分类 链表 难度 中等 老规矩 先上AC图 题目 82 删除排序链表中的重复元素 II 点击直达原网站 示例 1 输入
  • js删除服务器上文件,js删除服务器文件

    js删除服务器文件 内容精选 换一换 目标服务器已安装操作系统 并且处于联网状态 目标服务器已安装鲲鹏编译插件 保护组生产站点服务器为SUSE操作系统 对该云服务器开启容灾保护后 执行切换操作 云服务器EIP无法ping通 执行切换操作后
  • ASP.NET立即上手教程(2)

    什么是asp net的Web Forms Asp net Web Forms 页面框架是可升级的通用语言运行时刻 CLR 程序模型 用来在服务器端动态生成WEB页面 美国人说话就是别扭 其实Web Forms就是asp net编写的页面 作
  • 本征正交分解(POD)入门(详解)

    思来想去还是把题目从 简介 改成了 入门 详解 其实详解主要就是针对可能没接触过矩阵论的同学 我也是研一才学的 入门是指的我会解释一些名词 方便理解 另外PCA 主成分分析 本质上就是POD 只是我最近翻的热工学论文大部分都用的POD这个名
  • 楠姐技术漫话:接着唠唠社区发现

    halo 大家好很开心又和大家见面了 在第一篇 楠姐技术漫画 图计算的那些事 发布之后 楠姐收到了很多建议 鼓励和支持 非常感谢大家的喜欢 所以楠姐尽自己所能马不停蹄开始第二篇的创作 虽迟但到 本篇依然是风控算法分享 其实也依然算是图算法系
  • 从零开始搭建物联网平台(四)EMQ-X消息中间件

    物联网的消息中间件有很多 如ActiveMq RabbitMq Emq 以及自己实现的netty borker 这里为什么要选择EMQ呢 首先 在使用emqx之前我用过ActiveMq由于是国外开发的 对国内产品的支持不够好 文档和社区也远
  • c++ 使用libcurl下载网络图像

    include
  • 解决ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.7

    前言 最近因项目需要 部署区块链的网络时候 需要一个问题 运行下载的install sh脚本时候 提示出错 然后找到该脚本文件 找到对应报错的语句 发现是python的pip没有下载好的缘故 解决 问题原因知道了 然后就下载一个Pip就好
  • 家政服务小程序制作:提升生活质量、解决烦恼

    在现代快节奏的生活中 家政服务扮演着越来越重要的角色 借助家政服务小程序的制作 为用户提供便捷可靠的家务帮助已成为一种新的选择 那么家政服务小程序的制作过程是怎么样的呢 带来的好处有哪些呢 1 家政服务小程序的定义与优势 小程序是微信里面的
  • 第十八讲:神州三层交换机DHCP中继服务的配置

    当DHCP客户机和DHCP服务器不在同一个网段时 由DHCP中继传递DHCP报文 增加DHCP中继功能的好处是不必为每个网段都设置DHCP服务器 同一个DHCP服务器可以为很多个子网的客户机提供网络配置参数 即节约了成本又方便了管理 这就是
  • 流水灯实验过程

    流水灯 1 基本思路 先让P1口全为高电平 灯不亮 通过为左移 位右移动来实现依次点亮LED灯一个具有注脚的文本 1 用for循环语句嵌套 写程序 include
  • 在SpringBoot中整合其它技术

    在SpringBoot中整合其它技术 前言 一 SpringBoot整合SpringMVC 1 修改web端口 2 访问静态资源 3 添加拦截器 4 更详细的日志 二 SpringBoot整合MyBatis 1 整合连接池 2 整合myba
  • 老板说,可以在家办公,顿时办公室沸腾了……

    在美国的IT行业中 在家办公 WFH 仍然不是普遍现象 这有点匪夷所思 因为 1 员工渴望在家办公 2 有些雇主已经提供在家办公 3 反对在家办公的意见不能成立 在家办公 并不意味着 100 在家工作 从不需要去办公室 而是公司应该提供这些
  • opencv进行简单的裂缝检测

    师弟最近要使用四旋翼进行桥梁探伤 主要是用运动相机搭载在四轴上检测裂缝 就顺便搞了一下有关于裂缝检测的图像处理 算法比较简单 没有考虑太多复杂情况 在简单墙面背景下基本可以找到裂缝并框定 基本思路为 先转换彩色图为灰度图 然后进行自适应局部
  • 区块链能解决媒体行业哪些问题?

    对于最近炙手可热的区块链技术 最近流行起这样一句笑言 没有什么问题是人工智能解决不了的 如果有 那就用区块链解决 这句话虽然略显夸张 但也反映出人们对于区块链技术的高度期待 区块链有三个显著的特点 去中心化 可追溯 不可篡改 这三个特点为它
  • Linux 中不适用功能键切换TTY

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本简要指南介绍了在类 Unix 操作系统中如何在不使用功能键的情况下切换 TTY 在进一步讨论之前 我们将了解 TTY 是什么 正如在 AskUbuntu 论坛的一个答案
  • C#中关于在一个数据库同时修改2个数据的语法使用!

    SqlCommand cmd new SqlCommand update Student set Sname updateName where Sno Sno con SqlCommand cmd2 new SqlCommand updat
  • AES对称加密工具类(GCM)

    import java io UnsupportedEncodingException import java security InvalidAlgorithmParameterException import java security
  • Java实现图片格式转换(通过ImageIO)

    文章目录 粗略介绍ImageIO 一 遍历文件夹 二 转换图片格式 视频效果演示 粗略介绍ImageIO ImageIO是javax imageio包下的一个类 用于实现Java中关于图片输入输出的一种类 这个类中所有方法均为静态方法 因此