2016-05-04 25 views
1

我只需要一些指導,我找不到另一個問題。我想,答案甚至不一定是JavaFx特定的。在JavaFX中加載和處理大圖像的最有效方法

我想在JavaFX應用程序中加載和操作相當大的圖像/像素陣列。

現在我只是一個簡單的方法:一個簡單的Stackpane,其中包含一個Canvas對象,加載到ScrollPane中。

ScrollPane scrollPane = new ScrollPane(); 
StackPane stackPane = new StackPane(); 
Canvas = new Canvas(4000,6000); 

stackPane.getChildren().add(canvas); 
scrollPane.setContent(stackPane); 
root.setCenter(scrollPane); 

在某個Canvassize中,不可能創建一個Canvas對象,並且我會遇到一些例外。如果我腦海中有更大的維度會怎麼樣?

畫布的總大小是否會影響性能或滾動窗格中的詳細視圖?

+0

從你的問題來看,你不清楚爲什麼在談論圖像時使用'Canvas'。在我看來,在JavaFX中這意味着'Image'和'ImageView'。請澄清。 – hotzst

+0

有人告訴我Canvas在使用像素陣列時有更好的性能 – user6272596

回答

3

在某個Canvassize中,不可能創建一個Canvas對象,我會遇到一些例外情況。

默認情況下,JavaFX節點由圖形硬件渲染爲紋理。不同的圖形硬件在單個紋理可能的最大尺寸上有不同的限制。通常情況下,此紋理大小限制爲2的順序,各種圖形硬件的常見最大值可能爲8192x8192或16384x16384。出於兼容性原因,如果您想保持非常保守的特性,最好假定紋理尺寸最大爲8192x8192,甚至4096x4096。

如果我在腦海中有更大的尺寸該怎麼辦?

在平鋪算法中使用多個節點。例如,使用由64個4096x4096個別畫布節點組成的8x8陣列創建32768x32768畫布。你需要自己寫邏輯來處理這個問題,就我所知,沒有現成的庫會爲你做這件事。對於非常大的尺寸,例如數十萬甚至數百萬像素,然後虛擬化控件(如GridView)可能會有所幫助。

有人告訴我,帆布與像素陣列工作時

我懷疑畫布會比由PixelWriterPixelReader支持的WritableImage更好的性能特點,如帆布需要服務於具有更好的性能更廣泛和更復雜的特徵和功能陣列。也就是說,對於大多數應用程序來說,用戶幾乎不會注意到畫布和WritableImage之間的任何實質性差異,您應該根據最適合您應用程序的功能來選擇它們。另外,當使用圖像數據的像素級別操作時,一個性能提示是選擇圖形硬件本身使用的合適的PixelFormat,因爲這樣可以減少數據複製和像素數據轉換的數量,底層的圖形渲染系統需要這樣做。有關理解此性能技巧的更多信息,請參閱相關的Oracle JavaFX論壇主題:Canvas performance

+0

在這裏有很多好的信息(只要它是正確的)。 – XaolingBao

1

在這裏使用畫布可能不是一個好主意,因爲畫布不提供PixelReader。獲得像素的唯一方法是製作快照。通過一個圖像,你有一個PixelReader和一個PixelWriter。我懷疑任何嚴肅的圖像處理程序如果不能在兩個方向上操作單獨的像素,都會起作用。

相關問題