我想“求和”图像内的像素(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]);
}
有更好或更快的方式吗?
答案 0 :(得分:0)
手机GPU / CPU很少会靠近PC,所以你不是在这里比较苹果和苹果。话虽这么说,你可以采取几种方法来加快这个速度:
除了上面的#2之外,您必须重新编写算法才能进行并行化。每个都有其优点和缺点。如果你想看一些有一些性能数字的数字运算的实例,请查看我的AnDevCon旧金山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>