EN
Java - save BufferedImage to JPG file with quality
4
points
In this article, we want to show how to save BufferedImage to PNG file with quality using Java.
Practical example
Program.java
file:
package com.example;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class Program {
public static void main(String[] args) throws IOException {
BufferedImage image = ...;
JpegUtils.writeImage(image, "image.jpg", 0.75f); // quality from 0.0f to 1.0f (from 0% to 100%)
}
}
JpegUtils.java
file:
package com.example;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.spi.IIORegistry;
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.spi.ServiceRegistry.Filter;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageOutputStream;
public class JpegUtils {
private static final ImageWriterSpi SPI;
static {
IIORegistry registry = IIORegistry.getDefaultInstance();
Filter filter = (Object object) -> {
ImageWriterSpi spi = (ImageWriterSpi) object;
for (String type : spi.getMIMETypes()) {
if ("image/jpeg".equals(type)) {
return true;
}
}
return false;
};
Iterator<ImageWriterSpi> iterator = registry.getServiceProviders(ImageWriterSpi.class, filter, true);
try {
SPI = iterator.next();
} catch (NoSuchElementException ex) {
throw new RuntimeException("JPEG image writer is not supported.", ex);
}
}
private JpegUtils() {
// Nothing here ...
}
public static void writeImage(BufferedImage image, String path, float quality) throws IOException {
File file = new File(path);
IIOImage container = new IIOImage(image, null, null);
ImageWriteParam parameter = new JPEGImageWriteParam(null);
parameter.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
parameter.setCompressionQuality(quality);
try (ImageOutputStream stream = new FileImageOutputStream(file)) {
ImageWriter writer = SPI.createWriterInstance();
try {
writer.setOutput(stream);
writer.write(null, container, parameter);
} finally {
writer.dispose();
}
}
}
}
Note: the reasone why SPI is used is optimization by searching for
ImageWriterSpi
instance once and later using it to createImageWriter
object when needed.