我能说出BufferedImage的文件类型最初是什么吗?

2022-09-04 19:36:51

在我的代码中,我有一个BufferedImage,它是用ImageIO类加载的,如下所示:

BufferedImage image = ImageIO.read(new File (filePath);

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

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

我知道当我加载图像以查找扩展名时,我可以简单地解析文件路径,然后将其保存以供以后使用,但理想情况下,我希望有一种方法可以直接从BufferedImage中执行此操作。


答案 1

正如@JarrodRoberson所说,没有“格式”(即没有文件格式,它确实具有几种像素格式之一,或像素“布局”)。我不了解Apache Tika,但我想他的解决方案也会起作用。BufferedImage

但是,如果您更喜欢仅使用而不向项目添加新的依赖项,则可以编写如下内容: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();
}

答案 2

BufferedImage没有“格式”

一旦字节被转换为源文件的格式完全丢失,内容就代表了像素信息的原始字节数组。BufferedImage

溶液

在创建 之前,您应该使用 Tika 库从原始字节流中确定格式,而不是依赖于可能不准确的文件扩展名。BufferedImage


推荐