как получить значения rgb из растрового изображения?

#java #android #bitmap #rgb

#java #Android #растровое изображение #rgb

Вопрос:

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

Моя конечная цель — получить непрерывный захват экрана и преобразовать его в rob. следующий код работает нормально, но очень медленно.

есть ли какой-нибудь способ сделать это быстрее?

Будем признательны за любую помощь.

 //BTORGB
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_4444);
    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 = 4;
    int totalPixels = width * height;
    int totalBytes = totalPixels * componentsPerPixel;

    byte[] rgbValues = new byte[totalBytes];
    @ColorInt int[] argbPixels = new int[totalPixels];
    bitmap.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);
        int alpha = Color.alpha(argbPixel);

        rgbValues[i * componentsPerPixel   0] = (byte) red;
        rgbValues[i * componentsPerPixel   1] = (byte) green;
        rgbValues[i * componentsPerPixel   2] = (byte) blue;
        //            rgbValues[i * componentsPerPixel   3] = (byte) alpha;
    }

    return rgbValues;
}
  

Комментарии:

1. Если ваша цель — получить доминирующий или наименее доминирующий цвет или специальные цвета на изображении, ознакомьтесь с библиотекой палитр в Android

2. @AhmadSattout Спасибо за комментарий. Будет ли полезно получить байтовый массив пикселей, подобный byte[] pixels = new byte[w * h * 4]; , из растрового изображения?

3. Проблема @AhmadSattout заключается в том, что цикл ширины и высоты пикселя замедляет работу. т. е. totalPixels

4. Во-первых, вам не нужен массив с одним размером, вам нужен массив 2D, потому что он имеет ширину и высоту. Вы не можете избавиться от цикла, единственное, что вы можете сделать, это оптимизировать то, что находится внутри него.