18-4:JPEGファイルの入出力

JDK1.2 からイメージデータの入出力を直接取り扱うことが可能になりました。 その機能を紹介します。


・ com.sun.image.codec.jpeg パッケージは、 圧縮された形式の画像データを直接入力して BufferedImage(もしくは Raster)を生成したり、 逆に BufferedImage(もしくは Raster)の内容を保存したりする機能を提供します。
中心となるのは JPEGCodec という名前のクラスです。 このクラスは実際に入出力を担当する JPEGImageEncoder と JPEGImageDecoder のオブジェクトや、 JPEGファイルのパラメータを表す JPEGEncodeParam と JPEGDecodeParam の オブジェクトを手に入れるための staticなメソッドを提供します。
JPEGImageEncoder と JPEGImageDecoderは、 内部にストリームのオブジェクトを持ち、 通常のストリームへの入出力と同じ形式で取り扱うことが可能です。


// ファイルを読み込み BufferedImageを生成
FileInputStream input = new FileInputStream( "fujiki.jpg" );
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder( input );
BufferedImage image = decoder.decodeAsBufferedImage();

// Rasterの内容をファイルに保存
Raster raster = image.getRaster();
FileOutputStream output = new FileOutputStream( "fujiki2.jpg" );
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( output );
encoder.encode( raster ); 

・ com.sun.image.codec.jpeg には JPEG画像のパラメータを表す クラスも用意されています。 このクラスが提供する機能を用いることで、JPEG形式で保存する時の 画質(圧縮率)やスムーシングのパラメータの指定が可能になります。


JPEGDecodeParam dparam
    = decoder.getJPEGDecodeParam();   // 入力元のパラメータ情報を得る
JPEGEncodeParam eparam
    = JPEGCodec.getDefaultJPEGDecodeParam( dparam ); // 出力先のパラメータに変換
eparam.setQuality( 0.5f, false );      // 画質を落とす指定
encoder.setJPEGEncodeParam( eparam );  // 新しいパラメータ情報を設定