2016-11-14 7 views
2

У меня возникла проблема с переворачиванием по горизонтали или по вертикали Изображение в JavaFX Canvas.Flip JavaFX Изображение по горизонтали или по вертикали

шкала в теории:

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

Вот некоторые строки метода, который вызывается примерно 30 раз в second.So я использую метод gc.scale(-1,0) переворачивать изображение по горизонтали, но все lags.How может я сделай это?

public void drawMethod{ 

    //.... 

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


//... 
} 

Например, в Swing я использовал этот способ, чтобы отразить text->Reflecting text in java

Но в JavaFX я новичок в преобразованиях, так что я не знаю, что это способ сделать это (если это возможно я хочу знать, лучшие условия, как она от использования центрального процессора):


Пример изображения (то, что я есть):

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 кадрами в секунду, он работает плавно.

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

Hello Jewelsea Я предполагаю, что он подходит для 60 кадров в секунду ... Понятие 'gc.save();' я думаю, что он медленный. – GOXR3PLUS

+0

['gc.save()'] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#save--) просто вставляет некоторые атрибуты в стек , Это операция, которая будет выполняться очень быстро и не окажет существенного влияния на анимированные fps. – jewelsea

+0

Спасибо, драгоценности. Я выбрал второй ответ, потому что это очень просто и 1 строка :) – GOXR3PLUS