gpt4 book ai didi

Java,使用 AffineTransform 不完全居中旋转

转载 作者:行者123 更新时间:2023-11-30 07:27:22 24 4
gpt4 key购买 nike

我正在尝试旋转图像,但在旋转时它变得有点困惑,看起来它没有在中心旋转。所以如果我四处走走,它看起来就像被截断了。有没有更好的方法来获取图像的“中心”?

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

最佳答案

来 self 对 another similar question 的回答

如果您正在旋转,那么这将适用于 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);

关于Java,使用 AffineTransform 不完全居中旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com