私の問題は非常に単純です:
私は ImageIcon を持っています。正確に回転 * 90° 回回転した別のアイコンを取得したいと考えています。これは方法です:
private ImageIcon setRotation(ImageIcon icon, int rotation);
外部クラスを使用する必要はありません。ありがとう
通常、画像への変換はすべてBufferedImageに対して行われます。ImageIconから Image を取得し、それを BufferedImage に変換できます。
Image image = icon.getImage();
BufferedImage bi = new BufferedImage(
image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics bg = bi.getGraphics();
bg.drawImage(im, 0, 0, null);
bg.dispose();
次に、次のコードを使用して、-90 度から 90 度まで回転させることができます。
public BufferedImage rotate(BufferedImage bi, float angle) {
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(angle), bi.getWidth() / 2.0, bi.getHeight() / 2.0);
at.preConcatenate(findTranslation(at, bi, angle));
BufferedImageOp op =
new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
return op.filter(bi, null);
}
private AffineTransform findTranslation(
AffineTransform at, BufferedImage bi, float angle) {
Point2D p2din = null, p2dout = null;
if (angle > 0 && angle <= 90) {
p2din = new Point2D.Double(0, 0);
} else if (angle < 0 && angle >= -90) {
p2din = new Point2D.Double(bi.getWidth(), 0);
}
p2dout = at.transform(p2din, null);
double ytrans = p2dout.getY();
if (angle > 0 && angle <= 90) {
p2din = new Point2D.Double(0, bi.getHeight());
} else if (angle < 0 && angle >= -90) {
p2din = new Point2D.Double(0, 0);
}
p2dout = at.transform(p2din, null);
double xtrans = p2dout.getX();
AffineTransform tat = new AffineTransform();
tat.translate(-xtrans, -ytrans);
return tat;
}
これは、-90 度から 90 度までの回転イメージでうまく機能しますが、それ以上はサポートしません。座標の操作に関する詳細な説明については、AffineTransform のドキュメントを参照してください。
最後に、変換された Image: を ImageIcon に取り込みますicon.setImage((Image) bi);
。