Swing/RotatedIcon のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/RotatedIcon へ行く。
- 1 (2012-06-11 (月) 15:18:47)
- 2 (2012-06-11 (月) 19:44:17)
- 3 (2012-06-13 (水) 18:07:03)
- 4 (2012-06-15 (金) 21:42:32)
- 5 (2012-06-19 (火) 14:19:38)
- 6 (2012-06-21 (木) 17:06:27)
- 7 (2013-01-28 (月) 02:04:06)
- 8 (2013-08-17 (土) 01:33:43)
- 9 (2014-11-22 (土) 03:59:58)
- 10 (2014-12-16 (火) 14:22:48)
- 11 (2016-03-01 (火) 14:02:33)
- 12 (2017-07-18 (火) 16:06:11)
- 13 (2018-07-18 (水) 15:55:26)
- 14 (2020-03-30 (月) 02:07:41)
- 15 (2020-10-19 (月) 03:19:54)
- 16 (2021-05-03 (月) 02:17:54)
TITLE:Iconを回転する
Posted by aterai at 2012-06-11
Iconを回転する
画像ファイルから90、180、270度回転したIconを作成します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
class RotateIcon implements Icon {
private int width, height;
private Image image;
private AffineTransform trans;
public RotateIcon(Icon icon, int rotate) {
image = new BufferedImage(
icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
width = icon.getIconWidth();
height = icon.getIconHeight();
if((rotate+360)%360==90) {
trans = AffineTransform.getTranslateInstance(height, 0);
trans.rotate(Math.toRadians(90));
}else if((rotate+360)%360==270) {
trans = AffineTransform.getTranslateInstance(0, width);
trans.rotate(Math.toRadians(270));
}else if((rotate+360)%360==180) {
//trans = AffineTransform.getTranslateInstance(width, height);
//trans.rotate(Math.toRadians(180));
trans = AffineTransform.getScaleInstance(1.0, -1.0);
trans.translate(0, -height);
width = icon.getIconHeight();
height = icon.getIconWidth();
}else{
throw new IllegalArgumentException("Rotate must be (rotate % 90 == 0)");
}
}
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D)g.create();
g2.translate(x, y);
g2.drawImage(image, trans, c);
g2.translate(-x, -y);
g2.dispose();
}
@Override public int getIconWidth() {
return height;
}
@Override public int getIconHeight() {
return width;
}
}
解説
- Default
- 幅高さ: 83x100
- Rotate: 180
- 幅高さ: 83x100
- 上下反転: AffineTransformOpで画像を反転する
- Rotate: 90(時計回りに90度)
- 幅高さ: 100x83(元画像の幅高さを入れ替え)
- 左上を原点に90度回転し、元画像の高さだけX軸プラス方向に移動
- Rotate: -90(反時計回りに90度)
- 幅高さ: 100x83(元画像の幅高さを入れ替え)
- 左上を原点に270度回転し、元画像の幅だけY軸プラス方向に移動