Demo:
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
public class ImageCompressExample implements Runnable, ChangeListener {
private BufferedImage original;
private JLabel compressedLabel;
private JSlider slider;
private int byteCount;
public ImageCompressExample(String url) throws IOException {
original = ImageIO.read(new URL(url));
}
public void run() {
slider = new JSlider();
slider.setMajorTickSpacing(10);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.addChangeListener(this);
compressedLabel= new JLabel();
updateCompressedLabel();
JPanel labelPanel = new JPanel(new GridLayout(2,1));
JLabel originalLabel = new JLabel(new ImageIcon(original));
originalLabel.setBorder(BorderFactory.createTitledBorder("original image"));
labelPanel.add(originalLabel);
labelPanel.add(compressedLabel);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(labelPanel, BorderLayout.CENTER);
f.getContentPane().add(slider, BorderLayout.SOUTH);
f.pack();
f.setResizable(false);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public void stateChanged(ChangeEvent e) {
if (!slider.getValueIsAdjusting())
updateCompressedLabel();
}
private void updateCompressedLabel() {
int value = slider.getValue();
compressedLabel.setIcon(new ImageIcon(compress(original, value/100f)));
String title = String.format("compression quality = %d%%, bytes = %,d", value, byteCount);
compressedLabel.setBorder(BorderFactory.createTitledBorder(title));
}
public BufferedImage compress(BufferedImage image, float quality) {
try {
Iterator<ImageWriter> writers = ImageIO.getImageWritersBySuffix("jpeg");
ImageWriter writer = writers.next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
ByteArrayOutputStream out = new ByteArrayOutputStream();
writer.setOutput(ImageIO.createImageOutputStream(out));
writer.write(null, new IIOImage(image, null, null), param);
byte[] data = out.toByteArray();
this.byteCount = data.length;
ByteArrayInputStream in = new ByteArrayInputStream(data);
return ImageIO.read(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
try {
String url = "http://www.rsportscars.com/foto/03/carreragt06.jpg";
EventQueue.invokeLater(new ImageCompressExample(url));
} catch (IOException e) {
e.printStackTrace();
}
}
}