JavaFX drawImage已旋转

JavaFX drawImage已旋转,java,image,javafx,rotation,transform,Java,Image,Javafx,Rotation,Transform,我正在玩JavaFX,在课程开始(阶段)中,我有以下代码: /*... Scene, stage, canvas ...*/ GraphicsContext gc = canvas.getGraphicsContext2D(); Image imgage = new Image("gfx/image.png"); gc.drawImage(image, 256, 256); 我如何在不旋转轴的情况下旋转它?我发现并尝试了以下方法: gc.save(); // saves t

我正在玩JavaFX,在课程开始(阶段)中,我有以下代码:

/*... Scene, stage, canvas ...*/
GraphicsContext gc = canvas.getGraphicsContext2D();
Image imgage = new Image("gfx/image.png");
gc.drawImage(image, 256, 256);
我如何在不旋转轴的情况下旋转它?我发现并尝试了以下方法:

gc.save(); // saves the current state on stack, including the current transform
gc.rotate(45);
gc.drawImage(image);
gc.restore();
但是,当我使用改变位置x和y移动图像时,它也会变换轴。。它出错了,因为它使轴也旋转。我一直在考虑使用sin和cos函数重新计算移动,但我相信有一个更简单的解决方案

它可能与BuffereImage一起工作,但他们使用不同的图形类绘制它,我不知道如何使它一起工作

编辑:好的,如何只旋转图像而不旋转整个图形上下文

已解决: 谢谢大家的帮助:))我用这个>>

ImageView iv = new ImageView(new Image( "gfx/earth.png"));
iv.setRotate(40);
SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT);
Image rotatedImage = iv.snapshot(params, null);
gc.drawImage(rotatedImage, 0, 0);

让我们看看我是否能理解你的问题

如何仅旋转图像而不旋转整个GraphicsContext

仅使用GraphicsContext无法做到这一点。您需要旋转GraphicsContext,以使用drawImage API将旋转后的图像渲染到其上。为了防止旋转操作影响其他画布绘制操作,可以在执行旋转之前和之后保存和恢复GraphicsContext(正如您在问题代码中所做的那样)

但是,在不旋转GraphicsContext的情况下实现所需的一种方法是将场景图形与画布结合使用。将图像放置在ImageView中,对图像应用旋转变换,对其进行快照以获得旋转图像,然后将旋转图像绘制到画布中

ImageView iv = new ImageView(image);
iv.setRotate(40);
SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT);
Image rotatedImage = iv.snapshot(params, null);
gc.drawImage(rotatedImage, 0, 0);
示例代码:

通常,我不建议像上面的示例中那样混合场景图和画布API,而是只对场景图API或画布API进行编码

有关仅画布解决方案的示例,请参见以下问题的答案:


一般来说,对于大多数操作,我发现使用场景图API比编码到画布API更简单,建议在大多数任务中使用场景图API而不是画布API。

根据另一条评论,如果您想围绕一个点旋转图像,并且不想旋转图像,您应该像我在rotateImage函数中那样添加setViewport和setTransform更改图像的中心

public Image rotateImage(Image image, int rotation) {
    ImageView iv = new ImageView(image);
    SnapshotParameters params = new SnapshotParameters();
    params.setFill(Color.TRANSPARENT);
    params.setTransform(new Rotate(rotation, image.getHeight() / 2, image.getWidth() / 2));
    params.setViewport(new Rectangle2D(0, 0, image.getHeight(), image.getWidth()));
    return iv.snapshot(params, null);
}

一个相当快速且肮脏的方法也是有效的,即平移并旋转整个GraphicsContext,然后相对于0绘制图像(在本例中,旋转是从图像的中间开始的)。然后,在绘制图像后,反转操作

例如,如果有图像(img)、图形上下文(gc)和图像位置(xp、yp),则:


为什么要在
画布上绘制图像?你能用
ImageView
来代替吗?我真的不明白在你的问题中“旋转轴”是什么意思。什么轴心?这是在其他未提供的代码中显示的某个轴的可见渲染吗?很可能,此问题是的重复问题,但我很难确定这一点。我已从您的链接尝试了解决方案。。但这导致了坐标系问题。我想我的问题很容易理解是的!我一直在寻找的快照参数部分。。谢谢:)是的,但无论如何值得一试:)谢谢
public Image rotateImage(Image image, int rotation) {
    ImageView iv = new ImageView(image);
    SnapshotParameters params = new SnapshotParameters();
    params.setFill(Color.TRANSPARENT);
    params.setTransform(new Rotate(rotation, image.getHeight() / 2, image.getWidth() / 2));
    params.setViewport(new Rectangle2D(0, 0, image.getHeight(), image.getWidth()));
    return iv.snapshot(params, null);
}
// Translate and rotate.
gc.translate(xp, yp);
gc.rotate(degrees);

// Note how the image is drawn relative to 0.  Since the image needs to be
// rotated around the image center, the center is simply half of the image
// dimension.
gc.drawImage( image, -image.getWidth/2.0, -image.getImageHeight/2.0);

// Reverse the translation and rotation once drawn.
gc.rotate(-degrees);
gc.translate(-xp, -yp);