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.
Program.java
file:
xxxxxxxxxx
1
package com.example;
2
3
import java.awt.image.BufferedImage;
4
import java.io.IOException;
5
6
public class Program {
7
8
public static void main(String[] args) throws IOException {
9
10
BufferedImage image = ...;
11
JpegUtils.writeImage(image, "image.jpg", 0.75f); // quality from 0.0f to 1.0f (from 0% to 100%)
12
}
13
}
JpegUtils.java
file:
xxxxxxxxxx
1
package com.example;
2
3
import java.awt.image.BufferedImage;
4
import java.io.File;
5
import java.io.IOException;
6
import java.util.Iterator;
7
import java.util.NoSuchElementException;
8
9
import javax.imageio.IIOImage;
10
import javax.imageio.ImageWriteParam;
11
import javax.imageio.ImageWriter;
12
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
13
import javax.imageio.spi.IIORegistry;
14
import javax.imageio.spi.ImageWriterSpi;
15
import javax.imageio.spi.ServiceRegistry.Filter;
16
import javax.imageio.stream.FileImageOutputStream;
17
import javax.imageio.stream.ImageOutputStream;
18
19
public class JpegUtils {
20
21
private static final ImageWriterSpi SPI;
22
23
static {
24
IIORegistry registry = IIORegistry.getDefaultInstance();
25
Filter filter = (Object object) -> {
26
ImageWriterSpi spi = (ImageWriterSpi) object;
27
for (String type : spi.getMIMETypes()) {
28
if ("image/jpeg".equals(type)) {
29
return true;
30
}
31
}
32
return false;
33
};
34
Iterator<ImageWriterSpi> iterator = registry.getServiceProviders(ImageWriterSpi.class, filter, true);
35
try {
36
SPI = iterator.next();
37
} catch (NoSuchElementException ex) {
38
throw new RuntimeException("JPEG image writer is not supported.", ex);
39
}
40
}
41
42
private JpegUtils() {
43
// Nothing here ...
44
}
45
46
public static void writeImage(BufferedImage image, String path, float quality) throws IOException {
47
File file = new File(path);
48
IIOImage container = new IIOImage(image, null, null);
49
ImageWriteParam parameter = new JPEGImageWriteParam(null);
50
parameter.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
51
parameter.setCompressionQuality(quality);
52
try (ImageOutputStream stream = new FileImageOutputStream(file)) {
53
ImageWriter writer = SPI.createWriterInstance();
54
try {
55
writer.setOutput(stream);
56
writer.write(null, container, parameter);
57
} finally {
58
writer.dispose();
59
}
60
}
61
}
62
}
Note: the reasone why SPI is used is optimization by searching for
ImageWriterSpi
instance once and later using it to createImageWriter
object when needed.