2016-04-25 4 views
6

Ich entwickle eine Anwendung, die viel Vergleich der Bilddaten in JavaFX benötigt. Für diesen Vergleich muss ich RGB-Daten von Pixeln in den Bildern erhalten. Lassen Sie uns sagen, dass das Bild, das ich vergleichen muss, Picture1 und Picture2 ist. Picture1 ist ein vom Benutzer ausgewähltes Eingabebild. Picture2 ist eine Zeichnung, die ich programmatisch mache.Alternative (n) zum Umwandeln von Canvas in WriteableImage

AFAIK, die einzige Möglichkeit, rgb Daten pro Pixel in JavaFX zu erhalten, ist mit PixelReader von Image. Es ist in Ordnung für die Picture1 da es ein Eingang ist. Aber ich brauche eine Zeichnung auf Picture2 zu tun und Bild2 ist ein Canvas (I zeichnen Polygone auf Picture2 und weil Zeichnen Pixel für Pixel mit PixelWriter ist ein bisschen kompliziert IMO) und nicht über eine PixelReader oder etwas mit ähnlicher Funktionalität . Also meine Lösung ist wie folgt:

  1. Eingangsbild Lesen und machen Picture1
  2. eine Leinwand Marke und machen die Zeichnung
  3. Bringen Sie die Leinwand auf eine Szene
  4. Make Momentaufnahme der Szene und machen WritableImage (Bild2)
  5. Vergleichen Picture1 und Picture2

So habe ich eine Methode mit so etwas wie:

public static WritableImage makeDrawableImage(Canvas in) { 
    AnchorPane root = new AnchorPane(in); 
    WritableImage out = new WritableImage((int)in.getWidth(), (int)in.getHeight()); 
    Scene sc = new Scene(root, in.getWidth(), in.getHeight()); 

    out = in.snapshot(null, null); 

    return out; 
} 

Es dauert jedoch sehr lange, bis der Schnappschuss fertig ist. Der Wert out wird niemals zugewiesen. Ich weiß nicht, was ich falsch gemacht habe.

Gibt es eine Alternative Canvas zu Image oder WritableImage zu konvertieren? Oder vielleicht gibt es eine Bibliothek, die das Zeichnen von Polygonen einfacher macht mit PixelWriter?

Bitte seien Sie weich auf mich. Das ist meine erste Frage zu Stack Overflow und ich bin weder ein echter Programmierer noch ein IT-Student. Ich programmiere als Hobby.

Also, danke im voraus. Prost.

Antwort

1

Sie können einen Schnappschuss einer Leinwand mit dieser Methode erstellen:

public static WritableImage pixelScaleAwareCanvasSnapshot(Canvas canvas, double pixelScale) { 
    WritableImage writableImage = new WritableImage((int)Math.rint(pixelScale*canvas.getWidth()), (int)Math.rint(pixelScale*canvas.getHeight())); 
    SnapshotParameters spa = new SnapshotParameters(); 
    spa.setTransform(Transform.scale(pixelScale, pixelScale)); 
    return canvas.snapshot(spa, writableImage);  
} 

Das Pixel normalerweise Skala beträgt 1,0, wenn Sie einen HiDPI Bildschirm.

+0

Es funktioniert immer noch nicht :(Mein Problem ist mit der 'out = in.snapshot (null, null);' Es dauert wirklich lange Zeit. Ist es wirklich so lange dauern, um einen Schnappschuss zu machen? –

+0

What doen ' Wie groß sind Ihre Bilder? – mipa

+0

Offensichtlich verwenden Sie immer noch Ihren Code und nicht meins. In meinem Code gibt es keine Zeile 'out = in.snapshot (null, null);' Einen Schnappschuss von einem 2000x2000 Canvas machen dauert nur Millisekunden. – mipa

Verwandte Themen