0

我在一个 int 数组(int[] 像素)中有一个图像(大小为 1024x1024),我正在使用以下循环反转一个通道......

int i = 0;
for (int y = 0; y < H; y++) {
    for (int x = 0; x < W; x++) {
       int color = pixels[i];
       pixels[i] = Color.argb(Color.alpha(color), 255 - Color.red(color), Color.green(color), Color.blue(color));
       i++;
    }
}

在我的新 Galaxy S4 手机上,这需要超过 1 秒。即使在较旧的 iPhone 上,类似的循环也会在眨眼间运行。我在这里做错了什么吗?

如果我用“Color.BLUE”替换“Color.argb(Color.alpha(color), 255 - Color.red(color), Color.green(color), Color.blue(color))”,它会变得更快.

找到了解决方法。

如果我使用自己的位运算符而不是颜色函数,它会变得更快......

  int i = 0;
  for (int y = 0; y < H; y++) {
     for (int x = 0; x < W; x++) {
         int color = pixels[i];
         int red = ((color & 0x00ff0000) >> 16);
         pixels[i] = (color & 0xff00ffff) | ((255 - red) << 16);
         //pixels[i] = Color.argb(Color.alpha(color), 255 - Color.red(color), Color.green(color), Color.blue(color));
         i++;
      }
  }
4

2 回答 2

0

您可能需要考虑使用 ColorMatrix 类来完成此操作:http: //developer.android.com/reference/android/graphics/ColorMatrix.html

以您的方式操作单个像素时,很可能会涉及相当大的开销。ColorMatrix 类是你的朋友。

于 2013-07-26T04:56:48.343 回答
0

我想如果你用这个替换这段代码,它会比较快

            int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        int pixels[] = new int[w * h];
        bitmap.getPixels(pixels, 0, w, 0, 0, w, h);
        int n = w * h;
        for (int i = 0; i < n; i++) {
            int color = pixels[i];
            pixels[i] = Color.argb(Color.alpha(color), 255 - Color.red(color), Color.green(color), Color.blue(color));
        }
        bitmap.setPixels(pixels, 0, w, 0, 0, w, h);
于 2013-07-26T05:03:43.333 回答