Подтвердить что ты не робот

Как вы получаете значения RGB из растрового изображения на устройстве Android?

Я хочу получить RGB-значения растрового изображения в android, но пока не могу этого сделать. Моя цель - получить значения RGB для каждого пикселя растрового изображения. Есть ли какая-то конкретная функция для Android или что-то еще? Также мне интересно, нужна ли мне функция colorMatrix()? Это очень важно для моего проекта. Благодаря

4b9b3361

Ответ 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;
}