Как получить значение RGB для каждого цвета, кроме одного одномерного целочисленного RGB-массива - PullRequest
1 голос
/ 06 декабря 2011

Я не слишком знаком со сдвигом битов, поэтому у меня следующий вопрос. Я использую функцию ниже (найденную в другом месте) для декодирования из YUV в массив RGB int.

Теперь я хочу настроить красные, зеленые или синие значения, чтобы создать какой-то пользовательский эффект фильтра. Мне нужно получить значение R, значение G и значение B. Каждое значение в диапазоне от 0 до 255. После этого мне нужно восстановить его в массиве rgb по указанному индексу. Поэтому мне нужно получить каждый цвет из rgb[i] и затем сохранить его в rgb[i]

void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
for (int j = 0, yp = 0; j < height; j++) { 
 int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
 for (int i = 0; i < width; i++, yp++) {
   int y = (0xff & ((int) yuv420sp[yp])) - 16;
   if (y < 0)
   y = 0;
   if ((i & 1) == 0) {
   v = (0xff & yuv420sp[uvp++]) - 128;
   u = (0xff & yuv420sp[uvp++]) - 128;
    }
  int y1192 = 1192 * y;
  int r = (y1192 + 1634 * v);
  int g = (y1192 - 833 * v - 400 * u);
  int b = (y1192 + 2066 * u);
  if (r < 0)
    r = 0;
  else if (r > 262143)
    r = 262143;
  if (g < 0) 
    g = 0;
  else if (g > 262143)
    g = 262143;
  if (b < 0)
    b = 0;
  else if (b > 262143)
    b = 262143;
   rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
  }
}
  }
}

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

В основном, цветовое преобразование - это умножение цветового вектора на матрицу, и Android предлагает его поддержку.Посмотрите:

http://developer.android.com/reference/android/graphics/ColorMatrix.html

Предлагает несколько удобных методов для создания желаемых преобразований.(см. пример в конце)

Как изменить цвета Drawable в Android?

0 голосов
/ 06 декабря 2011

Для вашего удобства класс Color содержит множество методов для получения и установки определенных частей 32-битного целого числа цвета, например,

Color.red(color) 

возвращает красную часть цвета int,
Или

Color.argb(alpha, red, green, blue)

, чтобы создать целое число из указанных значений (диапазон 0-255).
В документации по различным методам также указывается, как самостоятельно выполнять сдвиг битов, если это именно то, что вы хотите сделать.

...