So what is the general and easiest way to read a JPEG from a File, modify it and then write it back to the File
try{
File testimage = new File(“/opt/images/testimage.jpg”);
BufferedImage bufimg = ImageIO.read(testimage);
//MODIFY IMAGE
File outfile =new File(“/opt/images/modified.jpg”);
ImageIO.write(bufimage, “jpg”, outfile);
} catch (IOException ex) {System.out.println(“Exception : ” + ex);
}
but the above method drastically reduces quality and hence the size of the image sometimes by 70%, so if quality of the final image is not your concern then its ok. But if you want to retain the quality of the original JPEG then following(Inspired by this post) is the way to set the Quality for the final output JPEG.
try{
File testimage = new File(“/opt/images/testimage.jpg”);
BufferedImage bufimg = ImageIO.read(testimage);
File outfile =new File(“/opt/images/modified.jpg”);
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(“jpeg”);
ImageWriter writer = iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(1.0f);
writer.setOutput(outfile);
writer.write(null, new IIOImage(bufimg ,null,null),iwp);
writer.dispose();
} catch (IOException ex) {System.out.println(“Exception : ” + ex);
}
So the point here is while reading the JPEG things go very well but while writing ImageIO.write sets the default Quality and hence the reduction in the size of the final JPEG, so by setting the quality explicitly the problem is averted.
Further Reading: