Java, используя AffineTransform, не вращаясь точно по центру - PullRequest
2 голосов
/ 19 марта 2012

Я пытаюсь повернуть изображение, но оно слегка запутывается, когда я его вращаю, и похоже, что оно не вращается в центре. Так что, если я обойду, это будет похоже на усечение. Есть ли лучший способ получить «центр» изображения?

public void RotateImageLeft() {
    try {
        BufferedImage newImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), originalImage.getType());
        AffineTransform tx = new AffineTransform();
        tx.rotate(Math.toRadians(-90.0), originalImage.getWidth() / 2, originalImage.getHeight() / 2);



        Graphics2D g2 = newImage.createGraphics();
        g2.drawImage(originalImage, tx, null);

        originalImage = newImage;


        this.repaint();

        g2.dispose();
    } catch (Exception ex) {
        ex.toString();
    }


    //g2d.drawImage(getResImage(), rescale, x, y);


}

Для полного раскрытия кода, вот больше кода. Вот мой переопределенный метод painComponent:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    resizeImage();

    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(getResImage(), rescale, x, y);


}

Вот метод resizeImage (), который вызывается:

public void resizeImage() {
    Graphics g = getResImage().getGraphics();
    g.setColor(Color.WHITE);

    g.fillRect(0, 0, getResImage().getWidth(), getResImage().getHeight());
    int scaledWidth = (int) ((getOriginalImage().getWidth() * getHeight()
            / getOriginalImage().getHeight()));
    if (scaledWidth < getWidth()) {
        int leftOffset = getWidth() / 2 - scaledWidth / 2;
        int rightOffset = getWidth() / 2 + scaledWidth / 2;

        g.drawImage(getOriginalImage(),
                leftOffset, 0, rightOffset, getHeight(),
                0, 0, getOriginalImage().getWidth(), getOriginalImage().getHeight(),
                null);
    } else {
        int scaledHeight = (getOriginalImage().getHeight() * getWidth())
                / getOriginalImage().getWidth();

        int topOffset = getHeight() / 2 - scaledHeight / 2;
        int bottomOffset = getHeight() / 2 + scaledHeight / 2;

        g.drawImage(getOriginalImage(),
                0, topOffset, getWidth(), bottomOffset,
                0, 0, getOriginalImage().getWidth(), getOriginalImage().getHeight(),
                null);
    }
}

Я использую метод ResizeImage, поскольку хочу, чтобы любое изображение правильно помещалось на моей панели 720/432.

Вот несколько примеров фотографий. Предварительно повернутый enter image description here

Поствращенный:

enter image description here

Новый код: (новое изображение - правильная высота / ширина повернутого изображения, все еще получая черные полосы. Экраны ниже.

public void RotateImageLeft() {
    try {
        BufferedImage newImage = new BufferedImage( originalImage.getHeight(),originalImage.getWidth(), originalImage.getType());
        AffineTransform tx = new AffineTransform();
        tx.rotate(Math.toRadians(-90.0), newImage.getWidth() / 2, (newImage.getHeight() / 2));
        Graphics2D g2 = newImage.createGraphics();
        g2.drawImage(originalImage, tx, null);
        originalImage = newImage;
        this.repaint();
        g2.dispose();
    } catch (Exception ex) {
        ex.toString();
    }
}

Пост вращение: enter image description here

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Из моего ответа на другой похожий вопрос

Если вы вращаетесь, то это будет работать на 90 градусов.

  • переместить изображение так, чтобы оно было центрировано "вокруг" источника
  • вызов обычного rotate () без дополнительных параметров
  • Переместить изображение обратно в центр, помня, что теперь ширина =старая высота и высота = старая ширина.

Также помните, что шаги аффинного преобразования работают в обратном порядке.

AffineTransform tx = new AffineTransform();

// last, width = height and height = width
tx.translate(originalImage.getHeight() / 2,originalImage.getWidth() / 2);
tx.rotate(Math.PI / 2);
// first - center image at the origin so rotate works OK
tx.translate(-originalImage.getWidth() / 2,-originalImage.getHeight() / 2);
1 голос
/ 20 марта 2012

Если вы хотите повернуть изображение без обрезки, вам нужно сначала добавить черные полосы вокруг него, поскольку повернутый прямоугольник всегда будет иметь большую ограничивающую рамку, чем выровненный по оси (исключение: поворот квадрата с кратностью 90 градусов)).

Итак, вам нужно заранее выполнить тригонометрические вычисления, чтобы определить максимальную ширину / высоту повернутого изображения и объединить их с исходной шириной / высотой.Измените размер изображения (отцентрируйте его), используя эти размеры, поверните его, а затем обрежьте обратно до ширины / высоты повернутого изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...