JDK1.2 からイメージデータの入出力を直接取り扱うことが可能になりました。 その機能を紹介します。
com.sun.image.codec.jpeg パッケージは、
圧縮された形式の画像データを直接入力して
BufferedImage(もしくは Raster)を生成したり、
逆に BufferedImage(もしくは Raster)の内容を保存したりする機能を提供します。
JDK1.2β3 までは java.awt.image.codec という名前のパッケージが
存在しましたが、β4から大きく変わりました。
(それ以降は JDK1.2の正式版でも取り扱いは同じようです。)
パッケージの中のクラスやその取り扱いもかなり異なりますので注意が必要です。
中心となるのは 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 ); // 新しいパラメータ情報を設定