你好,我有一个问题要问你。我知道java一点,我需要你的帮助。 我试图通过多线程处理图像。这个想法很简单。我在线程中逐个像素加载,然后将其存储在bufferedImage对象中,然后保存。我将使用固定的线程nubmer。
这是我实现它的方法。由于长代码,我发布链接
http://pastebin.com/zuD9JTxn http://pastebin.com/FBZzsG2i
现在计算特定像素的新rgb值后的每个线程,将其发送到App。 我希望我可以将它存储在数组中,然后将其全部发送到应用程序,然后与其他线程合并。 这可能吗?
答案 0 :(得分:1)
有一些图像处理框架提供了这样做的功能。例如,在Marvin的情况下,您可以创建包含给定图像的特定区域的蒙版。然后,您创建线程以独立地处理每个区域。
在上面的例子中,单线程方法在650ms内处理了873x601图像。多线程方法(2个线程)在370ms内处理。
下面是负责处理多线程的源代码部分:
// Create two masks
MarvinImageMask mask1 = new MarvinImageMask
(
imageIn.getWidth(), // width
imageIn.getHeight(), // height
0, // x-start
0, // y-start
imageIn.getWidth(), // region´s width
imageIn.getHeight()/2 // region´s height
);
MarvinImageMask mask2 = new MarvinImageMask
(
imageIn.getWidth(), // width
imageIn.getHeight(), // height
0, // x-start
imageIn.getHeight()/2, // y-start
imageIn.getWidth(), // region´s width
imageIn.getHeight()/2 // region´s height
);
// Create two threads to process the same image (imageIn) using the algorithm l_pluginImage_1 and l_pluginImage_2
MarvinThread marvinThread_1 = new MarvinThread(pluginImage_1, imageIn, imageOut, mask1);
MarvinThread marvinThread_2 = new MarvinThread(pluginImage_2, imageIn, imageOut, mask2);
marvinThread_1.start();
marvinThread_2.start();
完整的源代码,您可以查看HERE。
答案 1 :(得分:0)
Java 7的Fork/Join框架在此应用程序中非常有用。
答案 2 :(得分:0)
BufferedImage
基本上是一个数组(某种类型)的包装器。根据我的理解,在简要查看代码之后,您只需根据像素的原始颜色更改像素的颜色。没有计算基于先前的计算。
这意味着您可以让任意数量的线程在图像的一部分上工作,并将值直接写回图像。线程全部完成后,您将获得更新的图像。
是的,一般使用Fork / Join和java.util.concurrent
包。