I have a use-case where I am consuming .TIFF files from upstream. However, the downstream doesn't support .TIFF format and as such, I am converting it to JPEG :
BufferedImage tiffImage = ImageIO.read(new File(tiffFilePath));
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter jpegWriter = writers.next();
ImageWriteParam writeParam = jpegWriter.getDefaultWriteParam();
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionQuality(0.2f); //can't compress it further due to processing issues.
FileImageOutputStream jpegOutput = new FileImageOutputStream(new File(jpegFilePath));
jpegWriter.setOutput(jpegOutput);
jpegWriter.write(null, new IIOImage(tiffImage, null, null), writeParam);
Further, as the client needs the processed file in .TIFF format, I am reconverting it in .TIFF back as following :
BufferedImage jpegImage = ImageIO.read(new File(jpegFilePath));
ImageWriter tiffWriter = ImageIO.getImageWritersByFormatName("tiff").next();
FileImageOutputStream tiffOutput = new FileImageOutputStream(new File(tiffFilePath));
tiffWriter.setOutput(tiffOutput);
ImageWriteParam writeParam = tiffWriter.getDefaultWriteParam();
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionType("JPEG");
tiffWriter.write(null, new IIOImage(jpegImage, null, null), writeParam);
The original .TIFF file is 60KB. The generated .JPEG is 57KB. However, on converting back to .TIFF, the generated file is at least 187KB(trying all different compression methods possible on .TIFF using the library).
Is there a better way to achieve this? I can't afford 3x filesize increase.