2013-02-10 18 views
5

Próbuję napisać układankę za pomocą JavaFX częściowo, ponieważ ktoś mnie zapytał, a częściowo dlatego, że chcę dać JavaFX iść. Mam jednak problem z rzeczywistym kadrowaniem obrazu.Efektywne przycinanie obrazu w JavaFX

Założeniem jest, aby użytkownik dostarczył obraz i program do cięcia obrazu na mniejsze kawałki. Proste, prawda? Mój problem jest taki: Jedynym sposobem udało mi się znaleźć, aby wyciąć obraz jest zrobić kopię obiektu i zmianę widoczną część kopii, oto przykład:

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). 

Wystarczy, aby wyjaśnić ostatnią linię , oto 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 

teraz to jest w porządku, jeśli mam cięcia obrazu na cztery lub dziewięć sztuk (gra jest przeznaczona dla małych dzieci), ale co zrobić, jeśli chcę, aby wyciąć zdjęcie w miłym 1200 elementów układanki? Czy nie spowoduje to wyjątkowo kosztownej operacji? Nie tylko samo przycinanie, ale także zachowanie w pamięci wielu kopii obrazu. Widzisz, jeśli dobrze rozumiem to, każdy fragment będzie składał się z całego oryginalnego obrazu z dużą jego częścią, która pozostanie "ukryta".

Czy po prostu nie rozumiem tej funkcji? Jeśli nie, to musi być lepszy sposób, prawda?

Odpowiedz

11

Korzystanie z PixelReader i WritableImage powinno pomóc.

następujące wycina nowy obraz ze starej jeden na position (x,y) i size (width, height)

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

Dzięki za odpowiedź, właściwie zapomniałem o tym pytaniu. – NotMyName

9

Wiele obiektów ImageView może odwoływać się do tego samego obrazu. Dane dotyczące samego obrazu są przechowywane w obrazie. Jeśli masz 1000 obiektów ImageView, z których każdy odwołuje się do tego samego obrazu, to w pamięci jest tylko 1 kopia pikseli. Tworzenie kopii za pomocą WriteableImage byłoby droższe niż posiadanie wielu obiektów ImageView.