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

我有一个BufferedImage实例的集合,一个主图像和一些通过在主图像上调用getSubImage创建的子图像.子图像不重叠.我也在修改子图像,我想把它分成多个线程,每个子图像一个.

根据我对BufferedImage,Raster和DataBuffer如何工作的理解,这应该是安全的,因为:

>只从一个线程访问BufferedImage的每个实例(及其相应的WritableRaster和SampleModel).
>共享的ColorModel是不可变的
> DataBuffer没有可以修改的字段(唯一可以改变的是支持数组的元素.)
>在单独的线程中修改数组的不相交段是安全的.

但是我在文档中找不到任何说明这样做绝对安全的内容.我可以认为它是安全的吗?我知道可以处理子Rets的副本,但我更愿意避免这种情况,因为内存限制.

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

最佳答案:

您是否考虑过使用JAI来管理“子图像”作为图块?如果你不必挂起原始图像BufferedImage实例以及它的所有subImage BufferedImage实例,它似乎更好地利用了资源.有关JAI的信息可以在这里找到:
JAI README

有一个类TiledImage,它实现了RenderedImage接口(给它一个带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使用渲染链,可以根据需要回收切片以适应内存约束.

上一篇:java – 如何更快地渲染我的数组?


下一篇:java – 相当于Clojure中的imshow?