JavaFX如何水平或垂直翻转图片

3

我遇到了一个问题,即在 JavaFX Canvas 中水平或垂直翻转图像。

理论上的缩放:

  flip here (scale(-1,1) ) |   here it was
                  _ _ _ _ _|_ _ _ _ _
                           |                                                                
 flip here (scale(-1,-1) ) |   fliped here( scale(1,-1) )

以下是一个每秒调用约30次的方法。因此,我使用gc.scale(-1,0)方法将图像水平翻转,但所有东西都很卡顿。有什么解决方法吗?

public void drawMethod{

  //....

  gc.drawImage(lightBlueLight, 0, 0); // where lightBlueLight is an `Image`


 //...
}

例如在Swing中,我曾经使用这种方式来反射文本->Java中的文本反射 但是在JavaFX中,我对转换还不熟悉,所以我不知道如何完成这个任务(如果可能的话,我想知道在CPU使用方面最好的方法):
示例图片(我拥有的内容):

enter image description here

我想在画布上绘制它,如下所示:

enter image description here

2个回答

4
尝试这个:

试一下:

public void draw(GraphicsContext g){
     //(javafx.scene.image.Image, 
     // sourceX,sourceY, sourceWidth,sourceHeight,
    //outputX,outputY,outputWidth,outputHeight);        
    g.drawImage(RESOURCE, 0, 0, RESOURCE.getWidth(), RESOURCE.getHeight(), RESOURCE.getWidth(),0,-RESOURCE.getWidth(),RESOURCE.getHeight());
}

通过将输出的宽度/高度值设为负数,可以翻转图像。(记得相应调整输出的X和Y)
我以30帧每秒的速度运行代码,它运行得很流畅。
结果: https://istack.dev59.com/6yPnP.webp 参考链接:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#drawImage-javafx.scene.image.Image-double-double-double-double-double-double-double-double-

我会看一下☺ 我需要至少60帧每秒。 - GOXR3PLUS
1
太棒了!谢谢 :) - GOXR3PLUS

4
除了一个比例尺,您还需要一个翻译,否则它将只在画布的左边缘翻转并显示空白。

fipped

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class Flipper extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Canvas canvas = new Canvas(300, 300);
        Image image = new Image("https://istack.dev59.com/ySbuj.webp");
        double xoff = 15;
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.save();
        gc.translate(image.getWidth() + xoff * 2, 0);
        gc.scale(-1, 1);
        gc.drawImage(image, xoff, 0);
        gc.restore();
        gc.drawImage(image, xoff, 0);
        stage.setScene(new Scene(new Group(canvas)));
        stage.show();
    }
}

你好Jewelsea,我认为它适合60帧每秒... gc.save(); 的概念我认为它很慢。 - GOXR3PLUS
gc.save() 只是将一些属性放在堆栈上。这是一个非常快速执行且对动画 fps 没有显着影响的操作。 - jewelsea
谢谢jewelsea。我选择了第二个答案,因为它非常简单,只有一行 :) - GOXR3PLUS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接