Я хочу получить RGB-значения растрового изображения в android, но пока не могу этого сделать. Моя цель - получить значения RGB для каждого пикселя растрового изображения. Есть ли какая-то конкретная функция для Android или что-то еще? Также мне интересно, нужна ли мне функция colorMatrix()? Это очень важно для моего проекта. Благодаря
Как вы получаете значения RGB из растрового изображения на устройстве Android?
Ответ 1
Это может быть немного запоздалым, но для устранения путаницы с использованием & 0xff:
В Java ints 32 бита, поэтому значения (A) RGB для каждого пикселя упаковываются в 4 байта. Другими словами, пиксель со значениями R (123), G (93), B (49) = FF7B 5D31 в модели ARGB_8888. Где Alpha = FF, R = 7B, G = 5D, B = 31. Но это сохраняется как int как -8692431.
Итак, чтобы извлечь значение Green из -8692431, нам нужно сдвинуть 5D на 8 бит вправо, как вы знаете. Это дает 00FF 7B5D. Итак, если бы мы просто приняли это значение, мы бы оставили 16743261 в качестве нашего значения Green. Поэтому мы побитовое и это значение с маской 0xFF (что эквивалентно 0000 00FF) и приведет к тому, что 00FF 7B5D будет "замаскировано" до 0000 005D. Итак, мы извлекли наше значение Зеленого значения 93.
Мы можем использовать одну и ту же маску 0xFF для каждого извлечения, потому что все значения были сдвинуты, чтобы вывести желаемые два байта как наименее значимые. Следовательно, ранее предложенный код:
int p = pixel[index];
int R = (p >> 16) & 0xff;
int G = (p >> 8) & 0xff;
int B = p & 0xff;
Если это станет более ясным, вы можете выполнить эквивалентную операцию:
int R = (p & 0xff0000) >> 16;
int G = (p & 0x00ff00) >> 8;
int B = (p & 0x0000ff) >> 0;
Для краткости дополнительные 0 можно отбросить и записать в виде
int R = (p & 0xff0000) >> 16;
int G = (p & 0xff00) >> 8;
int B = p & 0xff;
Обратите внимание, однако, что могут использоваться альтернативные цветовые модели, такие как RGB_555, который хранит каждый пиксель как всего 2 байта с различной точностью для каналов RGB. Поэтому вы должны проверить модель, которую использует ваш растровый рисунок, прежде чем выполнять извлечение, потому что цвета могут храниться по-разному.
Ответ 2
Вот как я пытаюсь получить это значение. Используйте bitmap.getPixel() для получения соответствующего растрового изображения в целочисленный массив. Используя операцию побитового вращения, мы получим значения RGB.
int[] pix = new int[picw * pich];
bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
int R, G, B,Y;
for (int y = 0; y < pich; y++){
for (int x = 0; x < picw; x++)
{
int index = y * picw + x;
int R = (pix[index] >> 16) & 0xff; //bitwise shifting
int G = (pix[index] >> 8) & 0xff;
int B = pix[index] & 0xff;
//R,G.B - Red, Green, Blue
//to restore the values after RGB modification, use
//next statement
pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
}}
Ответ 3
Bitmap.getPixel(x, y)
возвращает int с значениями цвета и значением альфа-значения, встроенными в него.
int colour = bitmap.getPixel(x, y);
int red = Color.red(colour);
int blue = Color.blue(colour);
int green = Color.green(colour);
int alpha = Color.alpha(colour);
Ответ 4
Один для утверждения меньше: D
imagen.getPixels(pix, 0, picw, 0, 0, picw, pich);
for (i = 0; i < pix.length; i++) {
r = (pix[i]) >> 16 & 0xff;
g = (pix[i]) >> 8 & 0xff;
b = (pix[i]) & 0xff;
}
Ответ 5
Произвольная обработка цветов растрового изображения
Здесь вы можете прочитать о различных методах Color, которые будут извлекать компоненты цвета из пикселя int.
Возможно, вы захотите применить фильтр к растровому изображению и вернуть массив байтов. В противном случае вы можете сократить этот пример до цикла for и прокрутить пиксели, генерируя ваш массив байтов.
private byte[] rgbValuesFromBitmap(Bitmap bitmap)
{
ColorMatrix colorMatrix = new ColorMatrix();
ColorFilter colorFilter = new ColorMatrixColorFilter(
colorMatrix);
Bitmap argbBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(argbBitmap);
Paint paint = new Paint();
paint.setColorFilter(colorFilter);
canvas.drawBitmap(bitmap, 0, 0, paint);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int componentsPerPixel = 3;
int totalPixels = width * height;
int totalBytes = totalPixels * componentsPerPixel;
byte[] rgbValues = new byte[totalBytes];
@ColorInt int[] argbPixels = new int[totalPixels];
argbBitmap.getPixels(argbPixels, 0, width, 0, 0, width, height);
for (int i = 0; i < totalPixels; i++) {
@ColorInt int argbPixel = argbPixels[i];
int red = Color.red(argbPixel);
int green = Color.green(argbPixel);
int blue = Color.blue(argbPixel);
rgbValues[i * componentsPerPixel + 0] = (byte) red;
rgbValues[i * componentsPerPixel + 1] = (byte) green;
rgbValues[i * componentsPerPixel + 2] = (byte) blue;
}
return rgbValues;
}