2016-11-14 162 views
2

我面臨的問題是水平或垂直翻轉JavaFX Canvas中的圖像。水平或垂直翻轉JavaFX圖像

規模在理論上:

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

下面是該方法的一些線被稱爲每second.So約30倍,我使用的方法gc.scale(-1,0)水平翻轉圖像,但一切都lags.How我可以去做?

public void drawMethod{ 

    //.... 

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


//... 
} 

例如在Swing我使用這種方式來反映文本 - >Reflecting text in java

但JavaFX的我是新來的轉換,所以我不知道什麼是做到這一點的方式(如果可能的話我想知道cpu使用率的最佳方式,條款):


樣圖(我有什麼):

enter image description here

我想繪製在畫布上爲:

enter image description here

回答

1

嘗試這種情況:

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 fps運行代碼,它運行平穩。

Result

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-

+0

我會看看我☺至少需要60幀。 – GOXR3PLUS

+0

太棒了!謝謝:) – GOXR3PLUS

1

除了規模,還需要一個翻譯,否則它只會圍繞翻轉畫布的左邊緣和什麼都不顯示。

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://i.stack.imgur.com/ySbuj.png"); 
     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(); 
    } 
} 
+0

你好Jewelsea我認爲它適合60 fps ... gc.save()的概念;'我認爲它很慢。 – GOXR3PLUS

+0

['gc.save()'](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#save--)只是在堆棧上粘貼一些屬性。這是一個非常快速執行的操作,對動畫fps沒有顯着影響。 – jewelsea

+0

謝謝jewelsea。我選擇了第二個答案,因爲它非常簡單,並且有1行:) – GOXR3PLUS