18-6:イメージの変形処理


・ Graphics2D の新機能に対応して、 イメージに対しても線形変換や重ね合わせの処理を行う必要があります。 一般の変換を受けた場合には、 1つのピクセルが必ずしも1つの新しいピクセルになるわけではありません。 したがって処理はそれほど簡単ではありません。
幸いなことに、 こうした一般的な変換に対応する処理を与えてくれるクラスが用意されています。 イメージを歪める変換の例で見てみましょう。


BufferedImage orig, conv;
AffineTransformOp ato = new AffineTransformOp( 
       AffineTransform.getShearInstance( 0.5, 0.5 ),
       AffineTransformOp.TYPE_NEAREST_NEIGHBOR );
conv = ato.filter( orig, null );

イメージを加工する処理を行うクラスは java.awt.imageの BufferedImageOp と RasterOp の2個のインターフィエスに定義された メソッドを実装する必要があります。 そうしたクラスの1つが AffineTransformOpです。 名前のとおり一般の線形変換による変換の処理を提供するのが目的です。 このクラスのオブジェクトの最も一般的な生成方法は、 変換の行列の各要素の値を直接与えるやり方です。 その他に便利なように、拡大・縮小、回転、そして上のような「歪める」操作に 対応したオブジェクトを取り出す staticメソッドも用意されています。
変換のオブジェクトが得られたら、後はその filter()メソッドを呼び出すことで 新しいイメージのオブジェクトを得ることができます。 なお fileter()メソッドの第2引数は、 2個のイメージを合成して新しいイメージを生成するようなケースに指定します。 (不要な場合は nullでよい)