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

Most efficient way to load and process large images in JavaFX

我只需要一些指导,我找不到另一个问题来回答这个问题。我猜答案甚至不必是特定于 JavaFx 的。

我想在 JavaFX 应用程序中加载和操作相当大的 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);

在某个 Canvas 大小下,无法创建 Canvas 对象,我遇到了一些例外情况。如果我的脑子里有更大的维度怎么办?

canvas 的总大小会影响性能还是只影响滚动窗格中的详细视图?

At A certain Canvassize it is not possible to create a Canvas object and I get a few exceptions.

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

What if I had bigger dimensions in my mind?

在平铺算法中使用多个节点。例如,使用由 64 个 4096x4096 个单独的 canvas 节点组成的 8x8 数组创建一个 32768x32768 canvas。您将需要自己编写处理此问题的逻辑,据我所知,没有现有的库可以为您执行此操作。对于非常大的尺寸,例如数十万或数百万像素,然后 GridView 等虚拟化控件可能会有所帮助。

Someone told me Canvas has better performance when working with pixel arrays

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

顺便说一句,在处理图像数据的像素级操作时,一个性能提示是选择合适的 PixelFormat that is natively used by your graphics hardware, as that reduces the amount of data copying and transformations of pixel data that the underlying graphics rendering system needs to do. For more information in understanding this performance tip, refer to the related Oracle JavaFX forum thread: Canvas performance

在这里使用 canvas 可能不是一个好主意,因为 canvas 不提供 PixelReader。获得像素的唯一方法是制作快照。对于图像,您同时拥有 PixelReader 和 PixelWriter。我怀疑任何严肃的图像处理程序都无法在两个方向上处理单个像素。