Java多线程图像缩放

时间:2011-02-03 09:51:33

标签: java multithreading image scaling multicore

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

提前致谢

2 个答案:

答案 0 :(得分:5)

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

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

其次,您需要查看使用BufferedImage.getData(Rectangle)来剪切图像并拉出图像以进行处理。

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

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

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

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

你有:

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

答案 1 :(得分:2)

一个想法是将图像分成矩形区域 - 每个核心一个 - 然后让每个核心重新缩放其中一个区域。由于范围不重叠,您可以在不进行任何锁定的情况下执行此操作。