Java – can I tell bufferedimage what the original file type is?
In my code, I have a bufferedimage loaded with the imageio class, as shown below:
BufferedImage image = ImageIO.read(new File (filePath);
Later, I want to save it as a byte array, but imageio The write method requires me to choose GIF, PNG or JPG format to write my image (as described in the tutorial here)
I want to choose the same file type as the original image If the image was originally GIF, I don't want the overhead of saving it as PNG But if the image was originally PNG, I don't want to lose translucency and save it as JPG or GIF Is there any way to determine the original file format from bufferedimage?
I know I can simply parse the file path when I load the image to find the extension and save it for future use, but ideally I prefer to do this directly from bufferedimage
Solution
As @ jarrodroberson said, bufferedimage has no "format" (i.e. no file format, it does have one of several pixel formats, or pixel "layout") I don't know Apache Tika, but I think his solution is also feasible
However, if you prefer to use only imageio instead of adding new dependencies to your project, you can write the following:
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(); }