JPEG形式の画像の圧縮率を変更する

  • JavaJPEGの圧縮率を変更する方法のサンプルです。
  • 指定したサイズになるまで圧縮率を上げていきます。


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);
}
}

}