「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
ImageIO
Java的ImageIO包,实际上就是Javax下的ImageIO,包名位置:javax.imageio
:
可以说,是Java发布之初,就存在的基础包。作用就是读取图片为IO流,进而进行处理。
支持的图片格式
ImageIO支持的图片格式,就基本代表你Java原生的支持了,更具源码内代码:
public static String[] getReaderFormatNames() {
return getReaderWriterInfo(ImageReaderSpi.class,
SpiInfo.FORMAT_NAMES);
}
public static String[] getWriterFormatNames() {
return getReaderWriterInfo(ImageWriterSpi.class,
SpiInfo.FORMAT_NAMES);
}
复制代码
我们可以轻易输出支持的图片格式:
import javax.imageio.ImageIO;
import java.util.Arrays;
public class imageioTest {
public static void main(String[] args) {
String readFormats[] = ImageIO.getReaderFormatNames();
String writeFormats[] = ImageIO.getWriterFormatNames();
System.out.println("支持的Readers: " + Arrays.asList(readFormats));
System.out.println("支持的Writers: " + Arrays.asList(writeFormats));
}
}
复制代码
可以看到,支持的格式很多,但是现在一些比较新的格式是不支持的(比如:webp
)。
其实JEPG也支持不完整,需要扩充。
不用慌,其实这个是可以扩充的,我们可以使用很多方法扩充,比如上次说Java生成缩略图的文章里我提到的webp-imageio-core。
但是,为了支持更多的格式,今天介绍TwelveMonkeys。
TwelveMonkeys
TwelveMonkeys,第一反应,是不是经典电影,12只猴子?嘿嘿,那和我的第一反应一样嗷。
但是,这个其实是开源项目:TwelveMonkeys
另外是采用BSD-3-Clause License协议,相比GPL协议使用起来,更灵活。
作用
使用TwelveMonkeys可以扩展JavaX的ImageIO的包。这个过程很丝滑,你并不需要自己写任何的反射或者任何的配置类,只需要Maven内引用,即可使用。
支持的格式
相比原生Javax(ZuluJDK11)内ImageIO支持的:
支持的Readers: [JPG, jpg, tiff, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, tif, TIF, TIFF, jpeg, wbmp]
支持的Writers: [JPG, jpg, tiff, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, tif, TIF, TIFF, wbmp, jpeg]
复制代码
使用TwelveMonkeys的模块,后可以支持:svg
、iff
、pcx
和webp
等等格式
前面可以看到,有plugin
,其实TwelveMonkeys是一个项目工程,维护多个包,大家需要按需分配即可,同时注意前置依赖。
接下来,我们就演示一下如何安装和使用。
安装与使用
举个例子,我们想要让我们的项目支持Webp
,根据项目文档,webp是支持读,但是不支持写:
我们使用maven进行部署,在maven内添加:
<dependencies>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-webp</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
复制代码
之后,运行上文提到的getReaderFormatNames
和getWriterFormatNames
: 对比一下:
# 之前
支持的Readers: [JPG, jpg, tiff, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, tif, TIF, TIFF, jpeg, wbmp]
支持的Writers: [JPG, jpg, tiff, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, tif, TIF, TIFF, wbmp, jpeg]
# 之后
支持的Readers: [JPG, jpg, tiff, wbp, WBP, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, webp, tif, TIF, TIFF, WEBP, jpeg, wbmp]
支持的Writers: [JPG, jpg, tiff, bmp, BMP, gif, GIF, WBMP, png, PNG, JPEG, tif, TIF, TIFF, wbmp, jpeg]
复制代码
我们使用图片进行测试:
public class ImageioWrite {
public static void main(String[] args) {
try {
// 读取图片(读webp文件)
BufferedImage inputImage = ImageIO.read(
new File("src/main/java/cn/mintimate/imageio/test.webp")
);
// 输出图片
File outputImage = new File("src/main/java/cn/mintimate/imageio/test.jpeg");
ImageIO.write(inputImage,"jpeg",outputImage);
} catch (IOException e) {
e.printStackTrace();
}
}
}
复制代码
运行后:
高级使用
接下来,我们说一下twelvemonkeys的高级使用,其实更多的是高级引用,很多小伙伴看到支持SVG
是不是迫不及待的想直接试试?但是SVG
是有问题的。
SVG
很多小伙伴,是不是引为和webp
一样,添加SVG
依赖即可:
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-batik</artifactId>
<version>3.8.1</version>
</dependency>
复制代码
但是运行ImageIO
时候会报错:
主要的原因是需要前置依赖:
只需要更具项目说明,添加依赖: 你也可以直接用amven添加:
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svgpp</artifactId>
<version>1.14</version>
</dependency>
复制代码
之后,Java就支持读SVG
格式图片了:
但是我用ImageIO可以读,但是写为png
或jpeg
无法写出来,可能需要其他逻辑。我这里使用第三方包Thumbnailator;上篇文章也有介绍:Java使用Thumbnailator优雅地处理图片——图片转码和缩略图生成。
public class ImageioWrite {
public static void main(String[] args) {
try {
// 读取图片(读svg文件)
File inputImage=
new File("src/main/java/cn/mintimate/imageio/滑稽.SVG");
// 输出图片
File outputImage =
new File("src/main/java/cn/mintimate/imageio/test.png");
// 使用Thumbnails包
Thumbnails.of(inputImage)
.scale(1.0f)
.outputQuality(1f)
.outputFormat("png")
.toFile(outputImage);
} catch (IOException e) {
e.printStackTrace();
}
}
}
复制代码
END
到此,这就是TwelveMonkeys工程项目的使用嗷。不过,如果是想支持webp
,还是建议使用:github.com/nintha/webp…。
当然,现在用第三方API处理图片也不错就是了。哈哈,看项目需求吧~