当前位置: 首页 > 知识库问答 >
问题:

JavaFX drawImage已旋转

苏高峰
2023-03-14

我正在玩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移动图像时,它也会变换轴

它可能与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);

共有3个答案

慕通
2023-03-14

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

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

// 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);
董俊
2023-03-14

根据另一条注释,如果要围绕一个点旋转图像而不想更改图像的中心,则应像我在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);
}
路阳华
2023-03-14

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

如何仅旋转图像而不旋转整个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);

示例代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.*;
import javafx.scene.image.*;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/** Rotates and places it in a canvas */
public class RotatedImageInCanvas extends Application {
    @Override public void start(Stage stage) {
        Image image = new Image(
            "http://worldpress.org/images/maps/world_600w.jpg", 350, 0, true, true
        );

        // creates a canvas on which rotated images are rendered.
        Canvas canvas = new Canvas(600, 400);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        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);

        // supplies a tiled background image on which the canvas is drawn.
        StackPane stack = new StackPane();
        stack.setMaxSize(canvas.getWidth(), canvas.getHeight());
        stack.setStyle("-fx-background-image: url('http://1.bp.blogspot.com/_wV5JMD1OISg/TDYTYxuxR4I/AAAAAAAAvSo/a0zT8nwPV8U/s400/louis-vuitton-nice-beautiful.jpg');");
        stack.getChildren().add(
                canvas
        );

        // places a resizable padded frame around the canvas.
        StackPane frame = new StackPane();
        frame.setPadding(new Insets(20));
        frame.getChildren().add(stack);

        stage.setScene(new Scene(frame, Color.BURLYWOOD));
        stage.show();
    }

    public static void main(String[] args) { launch(RotatedImageInCanvas.class); }
}

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

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

  • 如何在JavaFX画布上绘制旋转图像

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

 类似资料:
  • 可以使用类的方法对图像执行旋转操作。以下是这种方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象。 dst - 表示此操作的目标(输出图像)的对象。 rotationMatrix - 表示旋转矩阵的对象。 size - 表示输出图像大小的整数类型变量。 示例 以下程序演示如何旋转图像。 假定以下是上述程序中指定的输入图像:。 执行上面示例代码,得到以下结果 -

  • 本文向大家介绍SVG 旋转,包括了SVG 旋转的使用技巧和注意事项,需要的朋友参考一下 示例 将多边形沿原点顺时针旋转90度: 结果等于 旋转中心可以明确给出: 结果等于            

  • 在本章中,我们向您解释了如何使用JOGL旋转对象。 使用GLMatrixFunc接口的glRotatef(float angle, float x, float y, float z)方法,可以沿三个轴中的任意一个旋转对象。 您需要将旋转角度和x,y,z轴作为参数传递给此方法。 以下步骤指导您成功旋转对象 - 最初使用gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2

  • 问题内容: 我想找出悬停时如何制作 旋转或旋转的图像 。我想知道如何在以下代码上使用 CSS 模仿该功能: 问题答案: 您可以将CSS3过渡与一起使用,以 在悬停时旋转图像 。 旋转图像:

  • 输出旋钮的转动位置(0~100) 用法 Your browser does not support the video tag. 案例:保险箱 说明:使用旋钮制作密码器,通过显示屏显示密码。输入密码正确后指示灯亮起,按下按钮保险箱被开启。 所需模块:电源、蓝牙模块、按钮、旋钮、显示屏、双舵机驱动、舵机驱动包、转接线10cm。

  • 旋钮可以调节数值输入的大小,完成对亮度、声音频率或速度大小的控制。 净重量:8.2g 体积:24×24×22.5mm 参数 使用寿命:>10000次 工作电压:DC 5V 抗跌落能力:1.5m 工作温度:-10℃~55℃ 工作湿度:<95% 特点 金属旋钮组件,大幅度提高耐用性。