快速扫描android中的整个图像像素

时间:2013-11-30 20:51:39

标签: c# java android

我想“求和”图像内的像素(r + g + b)。在C#中,我在5毫秒内完成了它。我在android(Galaxy 4)中最快的方式是101毫秒。我不知道什么是更快的方式,或者即使有更快的方式。

我的C#(不安全)代码是:

        int r = 0;
        int g = 0;
        int b = 0;
        int nWidth = bmp.Width;
        int nHeight = bmp.Height;

        BitmapData data = bmp.LockBits(new Rectangle(0, 0,
            nWidth, nHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

        int remain = data.Stride - data.Width * 3;

        byte* ptr = (byte*)data.Scan0;

        for (int i = 0; i < nHeight; i++)
        {
            for (int j = 0; j < nWidth; j++)
            {
                b += ptr[0];
                g += ptr[1];
                r += ptr[2];
                ptr += 3;
            }
            ptr += remain;
        }

在android中,我所做的是:

    Bitmap image = BitmapFactory.decodeFile("./sdcard/me.jpg");
    image.getPixels(pixels, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());
    int sum = 0;
    for (int i = 0; i < pixels.length; i++)
    {
        sum += Color.red(pixels[i]) + Color.green(pixels[i]) + Color.blue(pixels[i]);
    }

有更好或更快的方式吗?

2 个答案:

答案 0 :(得分:0)

手机GPU / CPU很少会靠近PC,所以你不是在这里比较苹果和苹果。话虽这么说,你可以采取几种方法来加快这个速度:

  1. 拆分代码以在多个Java线程中进行求和
  2. 编写NDK库以执行本机C / C ++代码中的求和工作
  3. 使用线程进行#2
  4. 切换算法以使用RenderScript进行求和。
  5. 除了上面的#2之外,您必须重新编写算法才能进行并行化。每个都有其优点和缺点。如果你想看一些有一些性能数字的数字运算的实例,请查看我的AnDevCon旧金山2013课程中的演示和演示:

    http://www.hiqes.com/android-dev-con-sf-2013/

答案 1 :(得分:0)

做((col>&gt;&gt; 16)&amp; 0xFF)+((col&gt;&gt; 8)&amp; 0xFF)+(col&amp; 0xFF)而不是Color.red(pixels [i])+ Color.green(pixels [i])+ Color.blue(pixels [i])(内联函数而不是调用它们)将时间从101毫秒降低到10毫秒:)这是一个可接受的时间... < / p>