アフィン変換(反転と回転)

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import javax.imageio.*;

public class Test {
	public static void main (String[] args)
	{
		AffineTransformOp1 win = new AffineTransformOp1("反転と回転");
	}
}

class AffineTransformOp1 extends JFrame
{
	/******************/
	/* コンストラクタ */
	/******************/
	AffineTransformOp1(String name)
	{
					// JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す)
		super(name);
					// Windowの大きさ
		setSize(1040, 370);
					// 画像の読み込み
		Image im = getToolkit().getImage("hana.gif");
		MediaTracker trk = new MediaTracker(this);
		trk.addImage(im, 0);
		try {
			trk.waitForID(0);
		}
		catch (InterruptedException e) {}
					// AffineTransformOp_e_MainPanel オブジェクト
		AffineTransformOp_e_MainPanel pn = new AffineTransformOp_e_MainPanel(im);   // AffineTransformOp_e_MainPanel オブジェクトの生成
		getContentPane().add(pn);   // AffineTransformOp_e_MainPanel オブジェクトを ContentPane に追加
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
	}

	/******************************/
	/* 上,左,下,右の余白の設定 */
	/******************************/
	public Insets getInsets()
	{
		return new Insets(50, 20, 20, 20);
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}
}

class AffineTransformOp_e_MainPanel extends JPanel
{
	Image im1;
	BufferedImage im0, im2, im3;
	AffineTransformOp_e_MainPanel(Image im)
	{
		im1 = im;
		setBackground(Color.white);   // 背景色の設定
					// BufferedImageに変換
		int w = im1.getWidth(null);
		int h = im1.getHeight(null);
		im0 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		Graphics g = im0.getGraphics();
		g.drawImage(im1, 0, 0, null);
		g.dispose();
					// 左右反転
		AffineTransform at1 = AffineTransform.getScaleInstance(-1.0, 1.0);
		at1.translate(-w, 0);
		AffineTransformOp op1 = new AffineTransformOp(at1, null);
		im2 = op1.filter(im0, null);
					// 45度回転
		AffineTransform at2 = new AffineTransform();
		at2.rotate(45 * Math.PI / 180, 0, 0);
		AffineTransformOp op2 = new AffineTransformOp(at2, null);
		im3 = op2.filter(im0, null);
	}
					// 描画
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画
							// 基の画像
		g.drawImage(im1, 50, 50, this);
							// 左右反転
		g.drawImage((Image)im2, 300, 50, this);
							// 45度回転
		g.drawImage((Image)im3, 550, 50, this);

		Graphics2D g2 = (Graphics2D)g;
		AffineTransform affin = new AffineTransform();
		affin.translate(850, 50);   //イメージの移動
		affin.rotate(45 * Math.PI / 180, 0, 0);   //イメージを画像の左上を中心に回転
		g2.drawImage(im1, affin, null);   //イメージの描画
	}
}