在JavaFX中加载和处理大图像的最有效方法

时间:2016-05-04 16:15:49

标签: image javafx pixels

我只需要一些指导,但我找不到另一个问题。答案甚至不一定是JavaFx-specifici,我想。

我想在JavaFX-Application中加载和操作相当大的Images / Pixel-Arrays。

现在我只有一个简单的方法:一个简单的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对象,但我得到一些例外。如果我脑子里有更大的尺寸怎么办?

画布的总大小是否会影响滚动窗格中的性能或仅影响详细信息视图?

2 个答案:

答案 0 :(得分:3)

  

在某个Canvassize中,无法创建Canvas对象,但我得到一些例外。

默认情况下,JavaFX节点由图形硬件呈现为纹理。不同的图形硬件在单个纹理的最大尺寸方面具有不同的限制。通常,此纹理大小限制为2的顺序,各种图形硬件的常见最大值可能为8192x8192或16384x16384。出于兼容性原因,如果您想要非常保守,最好假设最大纹理大小为8192x8192甚至4096x4096。

  

如果我脑子里有更大的尺寸怎么办?

在平铺算法中使用多个节点。例如,使用由64个4096x4096个别画布节点组成的8x8阵列创建32768x32768画布。你需要编写自己处理这个的逻辑,据我所知,没有现有的库会为你做这件事。对于极大的尺寸,例如数十万或数百万像素,然后虚拟控件(如GridView)可能会有所帮助。

  

有人告诉我Canvas在处理像素阵列时表现更好

我怀疑画布具有比WritableImagePixelWriter支持的PixelReader更好的性能特征,因为画布需要服务更广泛,更复杂的特征和功能。也就是说,对于大多数应用程序,用户不太可能注意到画布和WritableImage的性能之间存在任何实质性差异,您应该根据应用程序的最佳功能选择在两者之间进行选择。

另外,在处理图像数据的像素级操作时,一个性能提示是选择图形硬件本身使用的适当PixelFormat,因为这样可以减少数据复制和转换的数量。底层图形渲染系统需要做的像素数据。有关理解此性能提示的更多信息,请参阅相关的Oracle JavaFX论坛主题:Canvas performance

答案 1 :(得分:1)

在这里使用画布可能不是一个好主意,因为画布不提供PixelReader。获得像素的唯一方法是制作快照。使用图像,您既可以使用PixelReader,也可以使用PixelWriter。我怀疑任何严肃的图像处理程序都可以工作而不能在两个方向上操纵单个像素。