gpt4 book ai didi

Java:缓冲图像围绕其中心的旋转是倾斜的

转载 作者:行者123 更新时间:2023-11-30 07:46:13 25 4
gpt4 key购买 nike

我正在尝试使用此处的帮助围绕其中心旋转 Java 中的缓冲图像( map 上的平面图标): Rotating BufferedImage instances

当我使用这段代码时:

AffineTransform at = new AffineTransform();

at.rotate(Math.toRadians(planeHeading),origImage.getWidth() / 2, origImage.getHeight() / 2);

AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);

origImage = op.filter(origImage, null);

g.drawImage(origImage, x-origImage.getWidth() / 2, y-origImage.getHeight() / 2, null);

在旋转 180-270 度时,图像会被放置得更高,并且稍微偏向其中心的左侧:

enter image description here

如果我使用这段代码:

AffineTransform at = new AffineTransform();

at.translate(x, y);

at.rotate(Math.toRadians(planeHeading));

at.translate(-origImage.getWidth()/2, -origImage.getHeight()/2);

g.drawImage(origImage, at, null);

图像已正确旋转,但图像本身的边缘像素化程度很高。

enter image description here

有人可以帮忙找到罪魁祸首吗?

这是整个方法:

@Override
public void paintWaypoint(Graphics2D g, JXMapViewer viewer, MapPlane w)
{
g = (Graphics2D)g.create();

try
{
origImage = ImageIO.read(getClass().getResource("/images/map/mapPLANE.png"));

Point2D point = viewer.getTileFactory().geoToPixel(w.getPosition(), viewer.getZoom());

// Center coordinates
int x = (int)point.getX();
int y = (int)point.getY();

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// Get heading of the plane and rotate the image
String planeHeadingStr = w.getHeading();

try
{
double planeHeading = Double.parseDouble(planeHeadingStr);

AffineTransform at = new AffineTransform();

//Do the actual rotation
at.rotate(Math.toRadians(planeHeading),origImage.getWidth() / 2, origImage.getHeight() / 2);
AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
origImage = op.filter(origImage, null);

// Draw the image
g.drawImage(origImage, x-origImage.getWidth() / 2, y-origImage.getHeight() / 2, null);

}
catch(NumberFormatException e)
{

}


g.dispose();

}
catch (Exception ex)
{
log.warn("couldn't read mapPLANE.png", ex);
}

}

非常感谢!

最佳答案

要在第二种情况下使用 AffineTransform 直接绘制,要实现与 AffineTransformOp 相同的双线性插值,您应该设置另一个 RenderingHint:

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
RenderingHints.VALUE_INTERPOLATION_BILINEAR);

否则,在您的情况下,它默认为 NEAREST_NEIGHBOUR 插值。

关于Java:缓冲图像围绕其中心的旋转是倾斜的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50808540/

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