使用BufferedImage java在多线程中处理图像

时间:2014-06-06 09:15:20

标签: java multithreading image-processing bufferedimage

你好,我有一个问题要问你。我知道java一点,我需要你的帮助。 我试图通过多线程处理图像。这个想法很简单。我在线程中逐个像素加载,然后将其存储在bufferedImage对象中,然后保存。我将使用固定的线程nubmer。

这是我实现它的方法。由于长代码,我发布链接

http://pastebin.com/zuD9JTxn http://pastebin.com/FBZzsG2i

现在计算特定像素的新rgb值后的每个线程,将其发送到App。 我希望我可以将它存储在数组中,然后将其全部发送到应用程序,然后与其他线程合并。 这可能吗?

3 个答案:

答案 0 :(得分:1)

有一些图像处理框架提供了这样做的功能。例如,在Marvin的情况下,您可以创建包含给定图像的特定区域的蒙版。然后,您创建线程以独立地处理每个区域。

enter image description here

在上面的例子中,单线程方法在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包。