2013-02-10 13 views
5

Ich versuche ein Jigsaw Puzzle mit JavaFX zu schreiben, teilweise weil mich jemand gefragt hat und teilweise weil ich JavaFX ausprobieren will. Allerdings habe ich Schwierigkeiten mit dem eigentlichen Beschneiden des Bildes.Effektive Bildbeschneidung in JavaFX

Die Idee ist, dass der Benutzer das Bild und das Programm liefert, um das Bild in kleinere Stücke zu schneiden. Einfach, oder? Mein Problem ist folgende: Die einzige Art, wie ich das Bild finden konnte, schneiden ist eine Kopie des Bildobjekts zu machen und den sichtbaren Teil der Kopie zu ändern, hier ein Beispiel:

ImageView imgageView = new ImageView(); // Creates a new ImageView; this will be a single puzzle piece. 
imgageView.setImage(originalImage); // Use the original image as the "base." 
Rectangle2D rectangle = new Rectangle2D(0, 0, 50, 50); // Crop the image from (0,0) to (50, 50). 

Gerade die letzte Zeile zu klären hier ist die related piece in the API:

public Rectangle2D(double minX, 
      double minY, 
      double width, 
      double height) 
Creates a new instance of Rectangle2D. 
Parameters: 
minX - The x coordinate of the upper-left corner of the Rectangle2D 
minY - The y coordinate of the upper-left corner of the Rectangle2D 
width - The width of the Rectangle2D 
height - The height of the Rectangle2D 

Nun ist es in Ordnung, wenn ich das Bild in vier oder neun Stücke bin Schneiden (das Spiel für kleine Kinder gedacht ist), aber was ist, wenn ich das Bild in ein schönes schneiden möchten 1200 Stück Puzzle? Wird dies nicht zu einem extrem teuren Vorgang führen? Nicht nur das Zuschneiden selbst, sondern das Speichern vieler Kopien des Bildes im Speicher. Sehen Sie, wenn ich das richtig verstehe, besteht jedes Stück aus dem gesamten Originalbild mit einem großen Teil davon, das "versteckt" bleiben wird.

Bin ich die Funktion einfach missverstehen? Wenn nicht, muss es einen besseren Weg geben, richtig?

Antwort

11

Die Verwendung von PixelReader und WriteableImage sollte helfen.

folgende schneidet ein neues Bild von einem alten auf position (x,y) und size (width, height)

PixelReader reader = oldImage.getPixelReader(); 
WritableImage newImage = new WritableImage(reader, x, y, width, height); 
+0

Danke für die Antwort, ich habe eigentlich alles über diese Frage vergessen. – NotMyName

9

Mehrere Objekte Image das gleiche Bild verweisen können. Die Daten für das Bild selbst werden im Bild gespeichert. Wenn Sie über 1000 ImageView-Objekte verfügen, die jeweils auf dasselbe Image verweisen, ist nur eine Kopie der Pixel im Speicher vorhanden. Das Erstellen von Kopien mit WriteableImage wäre tatsächlich teurer als die Verwendung mehrerer ImageView-Objekte.