gpt4 book ai didi

java - 在单独的线程中更新 BufferedImage 的单独区域安全吗?

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:44 25 4
gpt4 key购买 nike

我有一组 BufferedImage 实例,一个主图像和一些通过调用主图像上的 getSubImage 创建的子图像。子图像不重叠。我还对子图像进行了修改,我想将其拆分为多个线程,每个子图像一个。

根据我对 BufferedImageRasterDataBuffer 工作原理的理解,这应该是安全的,因为:

  • BufferedImage(及其各自的 WritableRasterSampleModel)的每个实例仅从一个线程访问。
  • 共享的 ColorModel 是不可变的
  • DataBuffer 没有可以修改的字段(唯一可以更改的是支持数组的元素。)
  • 在单独的线程中修改数组的不相交段是安全的。

但是我在文档中找不到任何说明这样做绝对安全的内容。我可以假设它是安全的吗?我知道可以处理子 Raster 的副本,但由于内存限制,我宁愿避免这种情况。

否则,是否可以在不复制父图像区域的情况下使操作线程安全?

最佳答案

您是否考虑过使用 JAI 将您的“子图像”作为图 block 进行管理?如果您不必卡在原始图像 BufferedImage 实例及其所有子图像 BufferedImage 实例上,这似乎是更好地利用资源。关于 JAI 的信息可以在这里找到: JAI README

有一个类 TiledImage,它实现了 RenderedImage 接口(interface)(给它一个与 BufferedImage 的共同祖先)。根据 JAI 文档:

The use of tiling also facilitates the use of multiple threads for computation. Previously allocated tiles may also be re-used to save memory.

无论如何,使用 RenderedImage 的这些实现之一通常比 BufferedImage 更可取,因为 BufferedImage 在内存中为整个图像维护图像快照。 JAI 使用渲染链并可以根据需要回收图 block 以适应内存限制。

关于java - 在单独的线程中更新 BufferedImage 的单独区域安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2857332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com