Получить новый повернутый значок изображения из другого?

Моя проблема очень проста:

У меня есть ImageIcon, и я хочу получить еще один, который поворачивается точно на угол поворота *90°. Это метод:

private ImageIcon setRotation(ImageIcon icon, int rotation);

Я бы предпочел не использовать внешний класс. Спасибо

1 ответ

Получить BufferedImage от ImageIcon

Все преобразования в изображения обычно выполняются в BufferedImage. Вы можете получить Image из 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);,

Другие вопросы по тегам