Java多线程图像缩放

Ben*_*min 2 java scaling multithreading multicore image

我们目前正在使用Java JAI方法在我们的产品"Intermedia Fotoficient"中进行图像处理.我正在寻找一个图像缩放算法或一个实现,它使用多个线程来扩展双/四核CPU.原生加速将是一个很大的优势.

提前致谢

Riy*_*lla 5

这是对templatetypedef建议的肯定(和补充),这是一个坚实的建议.

首先,您需要确保使用多个线程来执行此操作 - 然后JVM和OS调度程序将确定如何在必要时确定如何在多个核心之间生成和负载平衡本机线程.你无法控制这个(谷歌的'java多核处理器支持'了解更多信息).

其次,您将需要查看使用BufferedImage.getData(Rectangle)来截取图像并拉出其中的部分以进行处理.

注意:大多数图像算法都使用单个像素周围的区域来确定新的缩放量将是什么...平均排序.因此,请仔细检查您正在切割的部分的内部边缘,以包含超出您需要的附加像素,以便缩放算法为您提供更准确的颜色值.

更具体地说,假设你砍掉图像的顶部左上角进行处理,所以它的尺寸从0,0开始并延伸到150,150.您需要切出160x160,以便沿着右侧切割线和底部切割线计算的所有像素值更准确,而不是仅分别在其右侧或底部混合.

现在,当您重新组装图像时,丢弃沿着切片边缘包含的"缓冲"空间,因为您不再需要它们,您只需要将图像缩放算法用于平均.

这种整体方法将处理器友好,每个图像需要处理大约3倍的内存(通常采用这些类型的处理器友好方法).

你有:

  1. 原始图像
  2. 原始图像数据的4倍四分之一切片副本
  3. 在扩展操作期间,JVM可能会持有所有4x四分之一切片副本和4x缩小版本的时间点.我们假设在缩放操作返回之前,您可以刷新/处理原始的4个切片.
  4. 在重新组装的那一刻,你还有原始图像(除非你刷了它?)然后是4个较小的四分之一和一个全尺寸的重新组装的缩放实例.

3x内存要求大致是最糟糕的情况,但要注意它.