0

int配列(int []ピクセル)に(サイズ1024x1024の)画像があり、次のループを使用して1つのチャネルを反転しています...

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.argb(Color.alpha(color), 255 - Color.red(color), Color.green(color), Color.blue(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 に答える