2013-02-10 88 views
5

我試圖用JavaFX編寫一個拼圖遊戲,部分原因是有人問我,部分是因爲我想給JavaFX一個去。但是,我在實際裁剪圖像時遇到了困難。JavaFX中的有效圖像裁剪

這個想法是爲用戶提供圖像和程序,將圖像切成小塊。很簡單,對吧?我的問題是這樣的:我能找到削減圖像的唯一方法是使圖像對象的副本,改變副本的可見部分,這裏有一個例子:

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

只是爲了澄清的最後一行,這裏的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 

現在,這是好的,如果我切割畫面分爲四或九件(遊戲是爲年幼的孩子),但如果我想將圖片裁剪成漂亮1200塊拼圖?這不會導致一個非常昂貴的操作?不僅裁剪本身,而且要在內存中保留很多圖像副本。看看,如果我正確地理解了這一點,那麼每件作品都將包含整個原始圖像,其中大部分將保持「隱藏」。

我只是誤解了函數?如果沒有,那麼一定有更好的方法來做到這一點,對吧?

回答

11

使用PixelReader和WritableImage應該有所幫助。

以下切斷從舊一個新的圖像在position (x,y)size (width, height)

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

感謝您的回答,我實際上已經忘記了這個問題。 – NotMyName 2013-03-26 14:02:49

9

多個ImageView的對象可以引用相同的圖像。圖像本身的數據存儲在圖像中。如果您有1000個ImageView對象,每個引用相同的Image,那麼內存中只有1個像素副本。使用WriteableImage創建副本實際上比擁有多個ImageView對象更加昂貴。