JPEG形式の画像の圧縮率を変更する
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import com.sun.image.codec.jpeg.*;
public class ProgressiveEncoder{
private static final long LN_MAX_FILE_SIZE_IN_BYTE = 65536L;
public static void main(String[] args){
String inFileName = "";
String outFileName = "out.jpg";
long maxFileSizeInByte = LN_MAX_FILE_SIZE_IN_BYTE;
float fqual = 1.0F;
if(args.length >= 3){
inFileName = args[0];
outFileName = args[1];
maxFileSizeInByte = Long.parseLong(args[2]);
}else if (args.length == 2){
inFileName = args[0];
outFileName = args[1];
}else if (args.length == 1){
inFileName = args[0];
}else{
throw new RuntimeException("パラメータが足りません");
}
try{
//アプリケーションフレームの作成
Frame appFrame = new Frame("圧縮中");
ImageCanvas imgCanvas = new ImageCanvas();
//元画像のロード
Image img = new ImageIcon(inFileName).getImage();
imgCanvas.setImage(img);
appFrame.setSize(800,600);
appFrame.add(imgCanvas);
appFrame.setVisible(true);
BufferedImage bi = new BufferedImage(img.getWidth(imgCanvas),img.getHeight(imgCanvas),BufferedImage.TYPE_INT_RGB);
Graphics graph = bi.getGraphics();
graph.drawImage(img,0,0,imgCanvas);
JPEGEncodeParam encodeParam = JPEGCodec.getDefaultJPEGEncodeParam(bi);
OutputStream ostream = new FileOutputStream(outFileName);
//出力ストリームの確保
for(fqual = 1.00F; fqual > 0.00F; fqual = fqual - 0.01F){
ByteArrayOutputStream baoutStream = new ByteArrayOutputStream();
encodeParam.setQuality(fqual,false);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( baoutStream, encodeParam);
encoder.encode(bi);
if(baoutStream.size() <= maxFileSizeInByte){
ostream.write(baoutStream.toByteArray());
break;
}}
ostream.flush();
ostream.close();
}catch(Exception ex){
ex.printStackTrace();
System.exit(9);
}
System.out.println("Quality=" + fqual);
System.exit(0);
}
}class ImageCanvas extends Canvas{
private Image image_;
public ImageCanvas(){
super();
}
public void setImage(Image img){
image_ = img;
}
public void paint(Graphics g){
if(image_ != null){
g.drawImage(image_,0,0,this);
}
}
}