Android Studio Color int 数组到 Color int 矩阵
Android Studio Color int array to Color int matrix
我正在使用 Android Studio 2.2,我正在从相机的 onPreviewFrame()
中获取 byte[] data
数组。我有一个 mutable 位图,其大小与相机图像的分辨率相同。我想用从 byte[] data
数组从 YUV
转换为 RGB
格式得到的 int[] array
中的像素覆盖位图的像素。所以我做了以下事情:
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
时得到的图像:
我在那个循环中做错了什么?
在我的函数中创建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;
}
我使用 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());
}
所以我还没有找到我的问题的答案,但我解决了我的问题。
我正在使用 Android Studio 2.2,我正在从相机的 onPreviewFrame()
中获取 byte[] data
数组。我有一个 mutable 位图,其大小与相机图像的分辨率相同。我想用从 byte[] data
数组从 YUV
转换为 RGB
格式得到的 int[] array
中的像素覆盖位图的像素。所以我做了以下事情:
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
时得到的图像:
我在那个循环中做错了什么?
在我的函数中创建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;
}
我使用 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());
}
所以我还没有找到我的问题的答案,但我解决了我的问题。