如何将android位图转换为NV12颜色格式? [英] How can I convert android bitmap to NV12 color format?
问题描述
我正在编写一些代码,用于将 android 位图转换为 NV12 格式.
I'm writing some code for converting android bitmap to NV12 format.
我找到了从 android 位图给我 NV21 的代码,而且代码似乎有效.(将位图数组转换为 YUV (YCbCr NV21))
I found code that gives me NV21 from android bitmap, and it seems that the code works. (Convert bitmap array to YUV (YCbCr NV21))
我发现的唯一区别是根据参考在 NV12 和 NV21 之间切换 U 和 V 字节.(http://www.fourcc.org/yuv.php)
Only difference I found is to switch U and V byte between NV12 and NV21 according to reference. (http://www.fourcc.org/yuv.php)
所以我把原代码中U和V的位置改了,结果如下
So I changed the position of U and V from original code, and then the result is like following.
byte [] getNV12(int inputWidth, int inputHeight, Bitmap scaled) {
// Reference (Variation) : https://gist.github.com/wobbals/5725412
int [] argb = new int[inputWidth * inputHeight];
//Log.i(TAG, "scaled : " + scaled);
scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight);
byte [] yuv = new byte[inputWidth*inputHeight*3/2];
encodeYUV420SP(yuv, argb, inputWidth, inputHeight);
scaled.recycle();
return yuv;
}
void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) {
final int frameSize = width * height;
int yIndex = 0;
int uvIndex = frameSize;
int a, R, G, B, Y, U, V;
int index = 0;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
a = (argb[index] & 0xff000000) >> 24; // a is not used obviously
R = (argb[index] & 0xff0000) >> 16;
G = (argb[index] & 0xff00) >> 8;
B = (argb[index] & 0xff) >> 0;
// well known RGB to YUV algorithm
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
V = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128; // Previously U
U = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128; // Previously V
yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));
if (j % 2 == 0 && index % 2 == 0) {
yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V));
yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U));
}
index ++;
}
}
}
我转换图像有错吗?(我很确定编码器没有问题.)
Am I wrong in converting images? (I'm pretty sure that encoder has no problem.)
Broken image screenshot : https://www.dropbox.com/s/vho14831fgnh1kl/Thu%20Aug%2001%2008_56_14%20GMT%2B09_00%202013%20%281%29.mp4_000002000.jpg
推荐答案
替换
a = (argb[index] & 0xff000000) >> 24; // a is not used obviously
R = (argb[index] & 0xff0000) >> 16;
G = (argb[index] & 0xff00) >> 8;
B = (argb[index] & 0xff) >> 0;
与,
R = (argb[index] & 0xff000000) >>> 24;
G = (argb[index] & 0xff0000) >> 16;
B = (argb[index] & 0xff00) >> 8;
这篇关于如何将android位图转换为NV12颜色格式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!