java – 我能告诉BufferedImage最初的文件类型是什么吗?

在我的代码中,我有一个 BufferedImage加载了 ImageIO类,如下所示:
BufferedImage image = ImageIO.read(new File (filePath);

稍后,我想将其保存为字节数组,但ImageIO.write方法要求我选择GIF,PNG或JPG格式来编写我的图像(如教程here中所述).

我想选择与原始图像相同的文件类型.如果图像最初是GIF,我不希望将其保存为PNG的额外开销.但如果图像最初是PNG,我不想失去半透明性,并将其保存为JPG或GIF.有没有办法可以从BufferedImage中确定原始文件格式是什么?

我知道我可以简单地解析文件路径,当我加载图像以找到扩展名并将其保存以供日后使用时,但理想情况下我喜欢直接从BufferedImage执行此操作.

解决方法

正如@JarrodRoberson所说,BufferedImage没有“格式”(即没有文件格式,它确实有几种像素格式之一,或像素“布局”).我不知道Apache Tika,但我想他的解决方案也可行.

但是,如果您更喜欢仅使用ImageIO而不是在项目中添加新的依赖项,则可以编写如下内容

ImageInputStream input = ImageIO.createImageInputStream(new File(filePath));

try {
    Iterator<ImageReader> readers = ImageIO.getimageReaders(input);

    if (readers.hasNext()) {
        ImageReader reader = readers.next();

        try {
            reader.setInput(input);

            BufferedImage image = reader.read(0);  // Read the same image as ImageIO.read

            // Do stuff with image...

            // When done,either (1):
            String format = reader.getFormatName(); // Get the format name for use later
            if (!ImageIO.write(image,format,outputFileOrStream)) {
                // ...handle not written
            }
            // (case 1 done)

            // ...or (2):
            ImageWriter writer = ImageIO.getimageWriter(reader); // Get best suitable writer

            try {
                ImageOutputStream output = ImageIO.createImageOutputStream(outputFileOrStream);

                try {
                    writer.setoutput(output);
                    writer.write(image);
                }
                finally {
                    output.close();
                }
            }
            finally {
                writer.dispose();
            }
            // (case 2 done)
        }
        finally {
            reader.dispose();
        }
    }
}
finally {
    input.close();
}

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...