java - 从另一个获得一个新的旋转图像图标?

标签 java swing graphics imageicon

我的问题很简单:

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

private ImageIcon setRotation(ImageIcon icon, int rotation);

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

最佳答案

从 ImageIcon 获取 BufferedImage

所有图像转换通常都是针对 BufferedImage 完成的。您可以从 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运行有关使用坐标的更多说明的文档。

将 BufferedImage 设置为 ImageIcon

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

关于java - 从另一个获得一个新的旋转图像图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831150/

相关文章:

java - 如何将鼠标监听器添加到包含呈现为复选框的 boolean 值的 JTable 单元格

java - 在 ActionListener 中使用 Thread.sleep() 的简单动画

windows - 如何创建具有独特 GUI(如 Valve 的 Steam)的应用程序?

algorithm - 如何跟踪/颜色分离使用 perlin 噪声生成的形状?

java - 使用 list 以及音频和图像文件夹(包括外部 jar)创建 jar 文件

用于选择一个或两个的 JAVA UI 元素

java - 如何创建创建列表的方法的通用版本

java - 使用从 Json 响应传递的对象填充 JTable

java - 如何有效地将数据从 CSV 加载到数据库中?

java - JSP页面只显示文件路径