EN
Java - resize JPG image (high quality)
7 points
In this short article, we would like to show how to resize image using Java.
The solution presented in the article provides quite good quality for the resized image. Resize image operation with quality is achieved by using embedded getScaledInstance()
method.

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
BufferedImage originalImage = JpegImageUtils.readImage("original-image.jpg");
10
if (originalImage != null) {
11
BufferedImage resizedImage = JpegImageUtils.resizeImage(originalImage, 300, 300);
12
JpegImageUtils.writeImage(resizedImage, 0.75f, "resized-image.jpg");
13
}
14
}
15
}
Hint: in the above example JPEG quality is set to
0.75f
(it should be in the range from0.0f
to1.0f
).
JpegImageUtils.java
file:
xxxxxxxxxx
1
package com.example;
2
3
import java.awt.Image;
4
import java.awt.Color;
5
import java.awt.Graphics;
6
import java.awt.image.BufferedImage;
7
import java.io.IOException;
8
import java.io.InputStream;
9
import java.io.FileInputStream;
10
import java.io.FileOutputStream;
11
import java.io.OutputStream;
12
import java.util.Iterator;
13
import javax.imageio.IIOImage;
14
import javax.imageio.ImageIO;
15
import javax.imageio.ImageWriter;
16
import javax.imageio.ImageWriteParam;
17
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
18
import javax.imageio.spi.IIORegistry;
19
import javax.imageio.spi.ImageWriterSpi;
20
import javax.imageio.spi.ServiceRegistry;
21
import javax.imageio.stream.MemoryCacheImageOutputStream;
22
23
public final class JpegImageUtils {
24
25
// constants
26
27
private static final ImageWriterSpi SPI;
28
29
// constructors
30
31
static {
32
IIORegistry registry = IIORegistry.getDefaultInstance();
33
ServiceRegistry.Filter filter = (Object object) -> {
34
ImageWriterSpi spi = (ImageWriterSpi) object;
35
for (String type : spi.getMIMETypes()) {
36
if ("image/jpeg".equals(type)) {
37
return true;
38
}
39
}
40
return false;
41
};
42
Iterator<ImageWriterSpi> iterator = registry.getServiceProviders(ImageWriterSpi.class, filter, true);
43
if (!iterator.hasNext()) {
44
throw new RuntimeException("JPEG image writer is not supported.");
45
}
46
SPI = iterator.next();
47
}
48
49
private JpegImageUtils() {
50
// Nothing here ...
51
}
52
53
// helper methods
54
55
private static ImageWriteParam createParameter(float quality) {
56
JPEGImageWriteParam parameter = new JPEGImageWriteParam(null);
57
parameter.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
58
parameter.setCompressionQuality(quality);
59
return parameter;
60
}
61
62
private static ImageWriter createWriter(OutputStream stream) throws IOException {
63
ImageWriter writer = SPI.createWriterInstance();
64
try {
65
writer.setOutput(new MemoryCacheImageOutputStream(stream));
66
} catch (Throwable ex) {
67
writer.dispose();
68
}
69
return writer;
70
}
71
72
// public methods
73
74
// ------ readImage
75
76
public static BufferedImage readImage(String path) throws IOException {
77
try (FileInputStream stream = new FileInputStream(path)) {
78
return ImageIO.read(stream);
79
}
80
}
81
82
public static BufferedImage readImage(InputStream stream) throws IOException {
83
return ImageIO.read(stream);
84
}
85
86
// ------ writeImage
87
88
public static void writeImage(BufferedImage srcImage, float dstQuality, String dstPath) throws IOException {
89
try (FileOutputStream dstStream = new FileOutputStream(dstPath)) {
90
writeImage(srcImage, dstQuality, dstStream);
91
}
92
}
93
94
public static void writeImage(BufferedImage srcImage, float dstQuality, OutputStream dstStream) throws IOException {
95
IIOImage image = new IIOImage(srcImage, null, null);
96
ImageWriteParam parameter = createParameter(dstQuality);
97
ImageWriter writer = createWriter(dstStream);
98
try {
99
writer.write(null, image, parameter);
100
} finally {
101
writer.dispose();
102
}
103
}
104
105
// ------ resizeImage
106
107
public static BufferedImage resizeImage(BufferedImage srcImage, int dstWidth, int dstHeight) {
108
return resizeImage(srcImage, dstWidth, dstHeight, Image.SCALE_AREA_AVERAGING);
109
}
110
111
public static BufferedImage resizeImage(BufferedImage srcImage, int dstWidth, int dstHeight, int dstHints) {
112
BufferedImage image = new BufferedImage(dstWidth, dstHeight, BufferedImage.TYPE_INT_BGR);
113
Graphics graphics = image.getGraphics();
114
try {
115
Image descriptor = srcImage.getScaledInstance(dstWidth, dstHeight, dstHints);
116
graphics.drawImage(descriptor, 0, 0, Color.WHITE, null);
117
} finally {
118
graphics.dispose();
119
}
120
return image;
121
}
122
}