2014-09-04 5 views
0

У меня есть video stream и нравится применять к нему эффект цветности. Я попытался это GPU library, но это даже медленнее, как мой собственный код:Android: производительность клавиш Chroma для видео

public class ChromaKey { 
    int[] pix; 
    Bitmap bm; 
    int picw, pich; 
    int index, cur_pix, red2, green2, blue2; 

    public Bitmap replaceIntervalColor(Bitmap bitmap,int red, int green, int blue) 
    { 
     if (bitmap != null) 
     { 
      picw = bitmap.getWidth(); 
      pich = bitmap.getHeight(); 
      if (pix == null) 
      { 
       pix = new int[picw * pich]; 
      } 
      bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich); 

      double distance; 

      for (int y = 0; y < pich; y++) { 
       for (int x = 0; x < picw ; x++) { 
        index = y * picw + x; 
        cur_pix = pix[index]; 
        red2 = (int)((cur_pix & 0x00FF0000) >>> 16); // Color.red(cur_pix); 
        green2 = (int)((cur_pix & 0x0000FF00) >>> 8); //Color.green(cur_pix); 
        blue2 = (int)(cur_pix & 0x000000FF); //Color.blue(cur_pix); 
        // faster Math.sqrt 
        // Source: http://stackoverflow.com/a/13264441/956397 
        /* distance = Math.sqrt(
          (red2 - red) * (red2 - red) 
            + (green2 - green) * (green2 - green) 
            + (blue2 - blue) * (blue2 - blue) 
        ); */ 
        distance = Double.longBitsToDouble(((Double.doubleToRawLongBits((red2 - red) * (red2 - red) 
          + (green2 - green) * (green2 - green) 
          + (blue2 - blue) * (blue2 - blue)) >> 32) + 1072632448) << 31); 

        if (distance < 190) 
        { 
         pix[index] = Color.TRANSPARENT; 
        } 
       } 
      } 

      if (bm == null) 
      { 
       bm = Bitmap.createBitmap(picw, pich, Bitmap.Config.ARGB_4444); 
      } 
      bm.setPixels(pix, 0, picw, 0, 0, picw, pich); 
      return bm; 
     } 
     return null; 
    } 
} 

Как я могу улучшить производительность этого кода?

Я уже перенес все создание объекта, чтобы повторно использовать память, но на столе высокого уровня все еще так медленно.

ответ

0

Предлагаем переместить эту операцию в исходную библиотеку (C/C++). Вы можете передать весь объект Bitmap в встроенную библиотечную функцию и изменить содержимое Bitmap без копий пикселей взад и вперед. Можно применять даже оптимизацию в ассемблере.

Или проще попробуйте оптимизировать код.

+0

Я сделал несколько простых измерений производительности с помощью 'System.nanoTime()', и оказалось, что этот код в порядке. Проблема была плохим сетевым подключением. – PiTheNumber