使用TwelveMonkeys扩充Java imageio包,支持读写更多格式图片

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

ImageIO

Java的ImageIO包,实际上就是Javax下的ImageIO,包名位置:javax.imageio:

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的模块,后可以支持:svgiffpcxwebp等等格式

支持的格式(部分)

前面可以看到,有plugin,其实TwelveMonkeys是一个项目工程,维护多个包,大家需要按需分配即可,同时注意前置依赖。

接下来,我们就演示一下如何安装和使用。

安装与使用

举个例子,我们想要让我们的项目支持Webp,根据项目文档,webp是支持读,但是不支持写:

项目文档 我们使用maven进行部署,在maven内添加:

<dependencies>
    <dependency>
        <groupId>com.twelvemonkeys.imageio</groupId>
        <artifactId>imageio-webp</artifactId>
        <version>3.8.1</version>
    </dependency>
</dependencies>
复制代码

之后,运行上文提到的getReaderFormatNamesgetWriterFormatNames支持的格式 对比一下:

# 之前
支持的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();
        }
    }
}
复制代码

使用ImageIO图片格式转换 运行后:

转码成功

高级使用

接下来,我们说一下twelvemonkeys的高级使用,其实更多的是高级引用,很多小伙伴看到支持SVG是不是迫不及待的想直接试试?但是SVG是有问题的。

SVG

很多小伙伴,是不是引为和webp一样,添加SVG依赖即可:

<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-batik</artifactId>
    <version>3.8.1</version>
</dependency>
复制代码

maven 但是运行ImageIO时候会报错:

报错

主要的原因是需要前置依赖:

需要依赖

只需要更具项目说明,添加依赖: 需要的依赖 你也可以直接用amven添加:

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>batik-svgpp</artifactId>
    <version>1.14</version>
</dependency>
复制代码

之后,Java就支持读SVG格式图片了:

支持SVG格式图片

但是我用ImageIO可以读,但是写为pngjpeg无法写出来,可能需要其他逻辑。我这里使用第三方包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();
        }
    }
}
复制代码

SVG To Png成功

END

到此,这就是TwelveMonkeys工程项目的使用嗷。不过,如果是想支持webp,还是建议使用:github.com/nintha/webp…

当然,现在用第三方API处理图片也不错就是了。哈哈,看项目需求吧~

猜你喜欢

转载自juejin.im/post/7055860423966326797