使用ImageIO进行图片转换的全面指南

解决ImageIO无法读取部分JPEG格式图片问题 在优化在线聊天功能时,我遇到了一次图片上传失败的问题,原以为是简单的文件格式限制,经过排查发现实际原因与 Java 的 ImageIO.read() 方法无法处理 .webp 格式图片有关。文章详细记录了调试过程,从文件格式的识别,到通过日志与代码逐步排查,最终发现 ImageIO 使用的 SPI 机制只支持常见格式(如 PNG、JPEG 等),导致了问题的出现。这篇文章分享了排查思路,揭示了 Java 在处理新兴图片格式上的局限性,帮助开发者应对类似问题。 阅读详情

在现代应用程序开发中,图片格式转换是一个常见需求。无论是将用户上传的图片转换为标准格式,还是为不同设备优化图片,我们都需要可靠的图片处理工具。Java提供了ImageIO类,它是处理图片I/O操作的标准API,能够满足大多数基本的图片转换需求。

本文将详细介绍如何使用ImageIO进行图片格式转换,包括基础用法、高级技巧以及实际应用示例。

一、ImageIO简介

javax.imageio.ImageIO是Java标准库的一部分,自Java 1.4版本起就包含在JDK中。它提供了一系列静态方法,用于读取和写入各种常见图片格式。

支持的格式

ImageIO支持多种常见的图片格式,包括但不限于:

  • ​​读取支持​​:JPEG、PNG、GIF、BMP、WBMP

  • ​​写入支持​​:JPEG、PNG、GIF、BMP、WBMP

要查看当前JVM支持的所有读写格式,可以使用以下代码:

// 获取支持的读取格式
String[] readFormats = ImageIO.getReaderFormatNames();
System.out.println("支持的读取格式: " + Arrays.toString(readFormats));

// 获取支持的写入格式
String[] writeFormats = ImageIO.getWriterFormatNames();
System.out.println("支持的写入格式: " + Arrays.toString(writeFormats));

二、基础图片转换

最基本的图片转换是从一种格式读取图片,然后以另一种格式保存。下面是一个简单的示例,将JPEG图片转换为PNG格式:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class BasicImageConverter {
    
    public static void convertImageFormat(String inputPath, String outputPath, String outputFormat) {
        try {
            // 读取输入图片
            File inputFile = new File(inputPath);
            BufferedImage image = ImageIO.read(inputFile);
            
            if (image == null) {
                System.err.println("无法读取图片,可能格式不支持或文件损坏: " + inputPath);
                return;
            }
            
            // 写入输出图片
            File outputFile = new File(outputPath);
            boolean result = ImageIO.write(image, outputFormat, outputFile);
            
            if (result) {
                System.out.println("图片转换成功: " + outputPath);
            } else {
                System.err.println("图片转换失败,可能不支持该输出格式: " + outputFormat);
            }
        } catch (IOException e) {
            System.err.println("转换过程中发生IO异常: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        // 示例:将JPEG转换为PNG
        convertImageFormat("input.jpg", "output.png", "png");
    }
}

三、特殊格式转换技巧

1、特殊格式转换

如:特殊格式:HEIC、DNG、webp、bmp、tiff、avif,上传时出现特殊格式的时候系统需要自动将这些格式转化为JPG、png的图片格式。

package com.hxl.kms.util;

import com.hxl.kms.config.KmsException;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;

public class ImageToJpgConverter {

    public static void main(String[] args) {
        File input = new File("avif.avif");   // 也可以是 .tiff, .webp
        BufferedImage image;
        try {
            image = ImageIO.read(Files.newInputStream(input.toPath()));
            if (image == null) {
                System.err.println("❌ ImageIO.read() 返回了 null,可能是因为文件格式不受支持,或文件已损坏");
                throw new KmsException("无法读取图片,可能格式不支持");
            }
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(image, "png", outputStream);

            FileOutputStream fos = new FileOutputStream("avif.png");
            outputStream.writeTo(fos);
        } catch (Exception e) {
            throw new KmsException("图片格式不正确,文件转换失败");
        }
    }




}

2. 处理透明通道

PNG支持透明通道,而JPEG不支持。在转换包含透明区域的PNG到JPEG时,透明区域会被填充为白色或其他颜色。

如果需要保留透明效果,应选择PNG或GIF格式。如果必须转换为JPEG,可以考虑将透明区域替换为特定背景色。

四、特殊格式maven依赖

ImageIO是 Java 标准库的一部分,自 ​​Java 1.4​​ 起就包含在 JDK 中,因此 ​​通常情况下不需要额外的 Maven 依赖​​ 即可使用。

也就是说,你可以在项目中直接使用 javax.imageio.ImageIO类及其相关功能,而无需在 pom.xml中添加特定的依赖项。特殊格式需要单独引入依赖包。示例:

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-core</artifactId>
            <version>3.10.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-tiff</artifactId>
            <version>3.10.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-webp</artifactId>
            <version>3.10.1</version>
        </dependency>

25行Java代码将普通图片转换为字符画图片和文本 原图 生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用notepad++等软件打开) 生成字符画图片(背景颜色和画笔颜色代码里可设置调节) 新建普通java 项目,Java单类实现代码,复制到java项目中,用idea编辑器 主方法运行。(引入的Class 都是JDK中自有的) import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.Buffer. 阅读详情

相关推荐

javax.imageio-1.0.5.jar

javax.imageio-1.0.5.jar, java处理图片的库。 从maven中央仓库下载的。实测可用。

Java ImageIO 类详解

Java 中的 ImageIO 类是 Java 标准库中用于处理图像的一个非常常用的 API,它提供了读取和写入多种常见图像格式的功能,如 JPEG、PNG、BMP、GIF 等。开发者可以通过 ImageIO 类轻松地读取和写入图像,而无需考虑底层的细节。本文将全面详细地介绍 Java 中的 ImageIO 类的使用方法。

兴趣是最好的老师,勤能补拙 1万+

imageio-jpeg-3.1.1-API文档-中英对照版.zip

赠送jar包:imageio-jpeg-3.1.1.jar; 赠送原API文档:imageio-jpeg-3.1.1-javadoc.jar; 赠送源代码:imageio-jpeg-3.1.1-sources.jar; 赠送Maven依赖信息文件:imageio-jpeg-3.1.1.pom; 包含翻译后的API文档:imageio-jpeg-3.1.1-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.twelvemonkeys.imageio:imageio-jpeg:3.1.1; 标签:twelvemonkeys、imageio、jpeg、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

Python中的imageio入门

在apply_gaussian_filter函数中,我们使用imageio.imread函数读取了指定路径的图像,并将其存储在image变量中。最后,在主函数中,我们指定了图像路径和高斯滤波的sigma值,并调用apply_gaussian_filter函数来应用高斯滤波。它提供了一种简单且高效的方式来处理图像数据,无论是从文件中读取图像,还是将图像保存到文件,甚至进行图像增强和转换操作。除了读取和保存图像,imageio库还提供了一些图像处理功能,例如调整图像大小、改变图像的色彩通道、应用滤镜等。

牛肉胡辣汤 1万+

Spirent TestCenter 3.90吞吐测试全流程详解(附RFC 2544配置避坑指南)

本文详细解析了使用Spirent TestCenter 3.90进行网络吞吐测试的全流程,并提供了符合RFC 2544标准的配置指南与避坑要点。内容涵盖测试环境搭建、核心概念澄清、STC软件配置步骤、结果深度解读以及自动化脚本入门,旨在帮助网络测试工程师精准评估设备性能,规避常见配置陷阱。

weixin_42602368的博客 370

从Transformer到蛋白质结构预测:手把手解读ESM系列模型的核心原理与实战价值

本文深入解析了ESM系列模型如何将Transformer架构创新应用于蛋白质结构预测,揭示了其从氨基酸序列到三维结构的高效预测机制。通过掩码语言模型预训练和注意力机制,ESM模型不仅捕捉蛋白质序列的远程相互作用,还在蛋白质工程改造、药物发现等领域展现出巨大实战价值,显著提升了结构预测速度和精度。

weixin_28744423的博客 320

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

文章目录粗略介绍ImageIO一、遍历文件夹二、转换图片格式总结 粗略介绍ImageIO ImageIO是javax.imageio包下的一个类,用于实现Java中关于图片输入输出的一种类,这个类中所有方法均为静态方法,因此调用时直接使用ImageIO.methodName() 即可. 相对于使用FileInputStream这类的节点流,使用ImageIO能真真正正的改变图片的格式而不只是修改图片的后缀名称. 当初看到了ImageIO能真正改变图片格式,因此想着要是以后需要改变图片的格式就不用专门去找某个

Zhangsama1的博客 9142

Vue3 + MQTT.js 实现 SCADA 实时数据通信:从不稳定到稳定的完整实践

本文介绍了SCADA组态引擎开发中MQTT协议的应用及优化实践。项目采用MQTT协议实现工业设备数据采集与可视化,但面临连接不稳定、数据格式多样化和数据绑定复杂三大问题。针对MQTT连接问题,分析发现超时设置过短(原8秒)、缺少客户端超时配置和心跳机制是主要原因。优化方案包括:协议转换(mqtt://→ws://)、双重超时保护(15秒手动+30秒客户端)、60秒心跳间隔等,显著提升了连接稳定性。通过完整代码实现展示了连接配置、认证处理和错误处理机制,为物联网数据传输提供了可靠解决方案。

weixin_36794508的博客 1403

Java 转换 WebP 图片,使用 webp-imageio

WebP 是 Google 推出的一种新型图片格式,相比于 传统的 PNG/JPG 图片有着更小体积的优势,在当今 Web 中有着广泛的应用。但是Java 和 JDK 本身不支持 WebP 图像,不过我们可以使用库来支持 WebP 图片。顺便提一提其他库支持的方式。WebP 最早是这个 webp project of Luciad 库提供支持的,但它需要手动安装对应的动态链接库,非常不方便。项目作者为了解决这个问题,改进了对动态链接库的读取方式,把从读取改成了从项目 resource 文件中读取。

zhangxin09的专栏 9001

银河麒麟V10 SP3离线安装Nginx1.21.5全记录(附11个rpm包下载清单)

本文详细记录了在银河麒麟V10 SP3操作系统上离线安装Nginx 1.21.5的全过程,包括11个必备rpm包的下载清单。通过分步骤的实战指南,帮助用户在国产化环境中高效部署Nginx服务,涵盖安装、配置、调优及故障排查等关键环节,特别适合金融、政务等对安全性要求高的场景。

weixin_30872337的博客 609

EXI编解码避坑指南:ISO15118-2协议中3条异常命令的差异分析

本文深度剖析了ISO15118-2协议测试中EXI编解码的典型问题,聚焦于ChargeParameterDiscoveryRes、CertificateInstallationReq和MeteringReceiptReq三条命令在不同工具间产生109字节差异的现象。通过对比EXICodec.jar、OpenEXI和Efficient XML的输出,揭示了差异根源于EXI报头处理机制与模式文件完整性,并提供了从现象确认、根因分析到解决方案的标准化排查流程,助力协议测试工程师确保编解码一致性与通信可靠性。

algae的博客 411

使用ImageIO进行图片和base64String的转换

图片转换base64String String path="/work/111.png"; File file=new File(path); BufferedImage bufferedImage=null; try { //图片转base64 bufferedImage=ImageIO.read...

weixin_39102174的博客 4698

第15章 AI 产品原型设计 —— 让 AI 成为你的产品经理

理解产品需求- 将模糊的想法转化为具体的原型方案生成高质量原型- 输出符合设计规范的 HTML 原型提供设计建议- 基于 UX 最佳实践给出优化建议维护原型文档- 自动更新原型说明和变更记录。

快乐的修补匠的专栏 507

JAVA中 BufferedImage、ImageIO用法

转载:JAVA中BufferedImage、ImageIO用法 - 邓维-java - 博客园 (cnblogs.com) BufferedImage BufferedImage是其Image抽象类的实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。 Java将一...

m0_56231540的博客 1万+

R语言实现TF-IDF算法

TF-IDF算法的基本原理是,一个词在文档中的重要性与它在当前文档中的频率成正比,与它在整个文档集中的频率成反比。TF(词频)指的是一个词在文档中出现的次数,而IDF(逆文档频率)衡量的是一个词在整个文档集中的普遍重要性。通过将TF和IDF相乘,可以得到一个词的TF-IDF值,用于衡量其在文档中的重要性。TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种常用的文本特征提取方法,用于评估一个词在文档集中的重要性。

CyberByte的博客 515

MFC Tab Control控件完全指南:从基础使用到高级定制

本文详细介绍了MFC中TabControl控件的使用方法和高级技巧。主要内容包括:1) TabControl基础属性设置与绑定;2) 样式定制和外观自定义;3) 创建派生类实现扩展功能;4) 动态页面管理和子对话框控制;5) 高级功能如标签拖拽排序和右键菜单。通过完整代码示例,展示了从基本应用到复杂场景的实现方案,包括多标签页管理、自定义绘制、动态添加/删除标签等核心功能,为MFC开发者提供了全面的TabControl开发指南。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 261

ImageIO 图片文件转换文件流

import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream...

qq_37428220的博客 1333

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JAVA ImageIO图片处理后变色

JAVA ImageIO图片处理后变色问题 最初使用ImagIO.Read() 从InputStream 转成BufferImage 然后进行水印添加,普通图片没问题,但是当前端通过JS剪裁传入后就出现变色的问题 压缩前 压缩后 网上查找了很久, 基本确定是ImageIO.Read 的问题,解决方案就变成避免使用这个函数,替代的方案为 Toolkit.getDefau...

lh8710的专栏 5773

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用Java ImageIO类进行批量图片格式转换(转载)

经常需要做图片格式转换,用Fireworks 等工具又太麻烦,于是自己写了这样一个程序进行批量格式转换。 使用Java进行图片格式转换可以借助ImageIO类 。ImageIO类在javax.imageio 包里,这个包里都是一些和图象输入输出有关的类。ImageIO类包含一组静态方法,用来快速定位ImageReader 和ImageWriter 并执行简单的编码和解码。 Image...

jason0898的博客 774

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python imageio读取自带图片_python 编程中的一个关于图片的库 imageio (读取照片RGB内容,转换照片格式)...

最近在看机器学习方面的东西,常常遇到须要把某个类型的照片中 RGB 内容读取出来, 在python中照片显示用matplotlib就能够作到,可是导入不一样格式的照片,保持出不一样格式的照片numpy, scipy, matplotlib 每每不是很能搞的定,因而就有了先手动转换照片格式,而后再用scipy进行导入的这一步骤。今天在看代码的时候无心中发现了一个很好用的图形库,imageio, 这...

weixin_39974557的博客 2696

ImageIO 支持webp格式

提供了很多图片格式的支持,其中也包括了webp,但是其仅支持webp格式的读取,不支持webp格式的写出,这样的话如果想把图片转换成webp格式的图片就没办法实现了;下面我们使用 webp-imageio-core 对ImageIO图片格式进行扩展,使其能够支持webp格式图片的转换;从运行的结果来看,读写图片已经支持了webp格式,这样就可以进行webp格式与其他的图片格式进行相互转换了。

Mointor 3103

ImageIO.read 读入.tif格式图片为空的处理

项目要求可以将.tif图片打印在pdf里,一般的ImageIO 不支持.tif格式的图片的,ImageIO.read 读入.tif格式的图片为空,导致Image.getInstance时报空指针异常。 首先的想法是将.tif转成常见的.jpg格式再进行打印

Myw1010266547的博客 3212

使用ImageIO读取网络图片(二维码)或本地图片

使用ImageIO读取网络图片(二维码)或本地图片 一读取网络图片 public static String analysisReadQRCode(String path){ MultiFormatReader multiFormatReader=new MultiFormatReader(); HashMap hints=new HashMap(); hints.put(EncodeHintType.CHARACTER_SET,"GBK");

qq_42229516的博客 2586

ImageIO 图片格式转换

【代码】ImageIO 图片格式转换。

Mointor 1508

PNM格式图片转换与JAI ImageIO

问题:png转为pnm格式图片 解决:代码如下 public static void main(String[] args) throws Exception { //tif/tiff/bmp/pbm转换png格式 String pngFilePath = "/Users/test/111.jpg"; String pbmFilePat...

xiuxiuzhuanshu的博客 558

使用ImageIo进行图片格式转换

将GIF 、 TIFF、ICO、WBMP图片格式转化为jpg,只保留每个文件夹中的里第一个图片,并且命名为该文件夹的名字。

weixin_40208374的博客 844
上一篇: CURL区别记录
SQL_sqq
博客等级 码龄4年 44粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值