从另一个图像获取新的旋转图像图标



我的问题很简单:

我有一个 ImageIcon,我想获得另一个精确旋转*90° 次的图像图标。这是方法:

private ImageIcon setRotation(ImageIcon icon, int rotation);

我宁愿不必使用外部类。谢谢

从 ImageIcon 获取缓冲图像

对图像

的所有转换通常都是对缓冲图像完成的。您可以从ImageIcon获取图像,然后将其转换为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 文档,了解有关使用坐标的更多说明。

将"缓冲图像"

设置为"图像图标"

最后,您用转换后的图像填充图像图标:icon.setImage((Image) bi);

相关内容

  • 没有找到相关文章

最新更新