イメージフィルタ
画像の切りぬき
ここでは、イメージフィルタの基本的なと使い方を説明したいと思います
高度なイメージファイルの操作には、欠かせないクラス郡を紹介します
イメージに関する処理はjava.awt.imageパッケージが担当します
基本的な操作として、画像ファイルから長方形を切りぬいて表示するフィルタ処理を行いましょう
画像を指定範囲の長方形で表示する方法は
通常ならばdrawImage()メソッドやクリップを用いても可能ですが
ここではフィルタ処理として、長方形の指定範囲の画像を表示させましょう
切りぬいたイメージの生成はComponentクラスのcreateImage()メソッドで行います
createImage()メソッドといえば、ダブルバッファリングで createImage( int width, int height ) をやりました
これはオフスクリーン用のイメージでしたが、もう一つ構文がありましたね
public Image createImage( ImageProducer producer )
イメージフィルタでは、このメソッドでイメージを生成します
ここで渡すのはImageProducerインターフェイスのオブジェクトです
イメージプロデューサの生成にはjava.awt.image.FilteredImageSourceクラスを使用します
このクラスはImageProducerをインプリメントしています
このクラスのコンストラクタは次のとおりです
public FilteredImageSource( ImageProducer orig, ImageFilter imgf )
このコンストラクタは、origで指定された既存のイメージプロデューサと
imgfに指定したフィルターオブジェクトからイメージプロデューサを生成します
既存のイメージはImageクラスのgetSource()メソッドで得ることができます
このメソッドはイメージを構成するピクセルを作成するイメージプロデューサを返します
public abstract ImageProducer getSource()
imgfで指定するのはjava.awt.image.ImageFilterクラスのオブジェクトです
このクラスはImageConsumerをインプリメントしています
フィルタ処理には、通常この基本クラスを拡張します
目的の、イメージを長方形にクリップするにはjava.awt.image.CropImageFilterクラスを用います
このクラスはImageFilterクラスを拡張しており、長方形領域の抽出をサポートしています
コンストラクタは次のとおりです
public CropImageFilter( int x, int y, int w, int h )
x , y は座標、w , h には横と縦幅です。ここで長方形を指定します
ここで指定された長方形を抽出したイメージソースを生成します
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
/* <applet code="App49.class" width="300"height="300">
<param name="img" value="img/test.jpg">
</applet>
*/
public class App49 extends Applet {
Image img , crp;
FilteredImageSource fis;
public void init() {
setBackground(Color.white);
img = getImage(getDocumentBase() , getParameter("img"));
ImageFilter fl = new CropImageFilter(100 , 100 , 200 , 200);
fis = new FilteredImageSource(img.getSource() , fl);
crp = createImage(fis);
}
public void paint(Graphics g) {
g.drawImage(crp , 0 , 0 , this);
}
}
このプログラムでは、読み込んだ画像から長方形を抽出し
抽出したイメージソースを表示しています
フィルターによる処理の過程は、上のプログラムの場合一行にまとめることもできます
crp = createImage(new FilteredImageSource(img.getSource() , new CropImageFilter(100 , 100 , 200 , 200)));
このプログラムのように、ImageFilterの一般的な使用方法は
FilteredImageSourceの元画像とフィルターを関連付けたインスタンス(プロデューサ)を
createImage()に渡すことで、フィルター処理された画像を生成します
画像サイズの変更
今度は、元画像から画像サイズを変更したイメージソースを生成してみましょう
画像アプリケーションなどでは、非常に重要なフィルターです
基本的なフィルターのかけ方は前回と同じです
前回使用したCropImageFilterクラスの部分に、画像サイズ専用のImageFilterを使います
画像のサイズ変更にはjava.awt.image.ReplicateScaleFilterクラスを用います
このクラスも、もちろんImageFilterクラスを拡張しています
ReplicateScaleFilterクラスは、指定された幅と高さにスケーリングします
サイズ変更は単純なアルゴリズムで、行や列の複製や削除で画像サイズを変更します
コンストラクタは次のとおりです
public ReplicateScaleFilter( int width, int height )
widthには横幅、heightには高さを指定します
このクラスと同様に、画像をスケーリングするjava.awt.image.AreaAveragingScaleFilterクラスもあります
このクラスはReplicateScaleFilterクラスを拡張しているクラスで
より複雑で繊細なアルゴリズムでイメージサイズを変更します
もちろん、画像は鮮明に精度を保ちながら拡大縮小できますが、その分処理は遅くなります
コンストラクタは次のようになっています
public AreaAveragingScaleFilter( int width, int height )
パラメータの内容はReplicateScaleFilter()コンストラクタと同じです
widthには横幅、heightには高さを指定します
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
/* <applet code="App50.class" width="600"height="300">
<param name="img" value="img/test.jpg">
</applet>
*/
public class App50 extends Applet {
Image img , rep , area;
FilteredImageSource fis;
public void init() {
setBackground(Color.white);
img = getImage(getDocumentBase() , getParameter("img"));
ImageFilter fl = new ReplicateScaleFilter(300 , 300);
fis = new FilteredImageSource(img.getSource() , fl );
rep = createImage(fis);
fl = new AreaAveragingScaleFilter(300 , 300);
fis = new FilteredImageSource(img.getSource() , fl );
area = createImage(fis);
}
public void paint(Graphics g) {
g.drawImage(rep , 0 , 0 , this);
g.drawImage(area , rep.getWidth(this) , 0 , this);
}
}
左がReplicateScaleFilterクラスのアルゴリズムで変倍された画像
右がAreaAveragingScaleFilterクラスのアルゴリズムで作成された画像です
明らかに右の画像のほうが鮮明で、ギザギザがありませんね