Android Studio Color int array to Color int matrix

Я использую Android Studio 2.2, и я получаю byte[] dataмассив onPreviewFrame()от камеры. У меня есть изменяемое растровое изображение с тем же размером, что и разрешение изображения с камеры. Я хочу переопределить пиксели растрового изображения пикселами из тогоint[] array, что я получаю от преобразования byte[] dataмассива YUVв RGBформат. Поэтому я делаю следующее:

public static void correctWithIntArray(Bitmap bmp,int[] data) {
    for(int y=0;y<bmp.getHeight();y++) {
        for(int x=0;x<bmp.getWidth();x++) {
            bmp.setPixel(x,y,data[y*bmp.getHeight() + x]);
        }
    }
}

Но я получаю очень странный результат на выходе.

Вот изображение, которое я сделал с Android классов, чтобы получить изображение:
Оригинальный

И вот изображение, которое я получаю при использовании correctWithIntArray:
CorrectedImage

Что я делаю неправильно в этой петле?

Функция для создания int[] dataмассива в моей функции:

/**
 * Converts YUV420 NV21 to RGB8888
 *
 * @param data byte array on YUV420 NV21 format.
 * @param width pixels width
 * @param height pixels height
 * @return a RGB8888 pixels int array. Where each int is a pixels ARGB.
 */
public static int[] convertYUV420_NV21toRGB8888(byte [] data, int width, int height) {
    int size = width*height;
    int offset = size;
    int[] pixels = new int[size];
    int u, v, y1, y2, y3, y4;

    // i percorre os Y and the final pixels
    // k percorre os pixles U e V
    for(int i=0, k=0; i < size; i+=2, k+=2) {
        y1 = data[i  ]&0xff;
        y2 = data[i+1]&0xff;
        y3 = data[width+i  ]&0xff;
        y4 = data[width+i+1]&0xff;

        u = data[offset+k  ]&0xff;
        v = data[offset+k+1]&0xff;
        u = u-128;
        v = v-128;

        pixels[i  ] = convertYUVtoRGB(y1, u, v);
        pixels[i+1] = convertYUVtoRGB(y2, u, v);
        pixels[width+i  ] = convertYUVtoRGB(y3, u, v);
        pixels[width+i+1] = convertYUVtoRGB(y4, u, v);

        if (i!=0 && (i+2)%width==0)
            i+=width;
    }

    return pixels;
}

1 ответ

  1. Я решил проблему с помощью setPixels()функции:

    /**
     * @param bmp Must be mutable.
     * @param data
     */
    public static void correctWithByteArray(Bitmap bmp,int[] data) {
        bmp.setPixels(data,0,bmp.getWidth(),0,0,bmp.getWidth(),bmp.getHeight());
    }
    

    Поэтому я не нашел ответа на свой вопрос, но я решил свою проблему.