android yuv怎么转换成RGB565?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android yuv怎么转换成RGB565?相关的知识,希望对你有一定的参考价值。
网上找了一个方法,但是要怎么用了。
static void cvt_420p_to_rgb565(int width, int height, const unsigned char *src, unsigned short *dst)
int line, col, linewidth;
int y, u, v, yy, vr, ug, vg, ub;
int r, g, b;
const unsigned char *py, *pu, *pv;
linewidth = width >> 1;
py = src;
pu = py + (width * height);
pv = pu + (width * height) / 4;
y = *py++;
yy = y << 8;
u = *pu - 128;
ug = 88 * u;
ub = 454 * u;
v = *pv - 128;
vg = 183 * v;
vr = 359 * v;
for (line = 0; line < height; line++)
for (col = 0; col < width; col++)
r = (yy + vr) >> 8;
g = (yy - ug - vg) >> 8;
b = (yy + ub ) >> 8;
if (r < 0) r = 0;
if (r > 255) r = 255;
if (g < 0) g = 0;
if (g > 255) g = 255;
if (b < 0) b = 0;
if (b > 255) b = 255;
*dst++ = (((unsigned short)r>>3)<<11) | (((unsigned short)g>>2)<<5) | (((unsigned short)b>>3)<<0);
y = *py++;
yy = y << 8;
if (col & 1)
pu++;
pv++;
u = *pu - 128;
ug = 88 * u;
ub = 454 * u;
v = *pv - 128;
vg = 183 * v;
vr = 359 * v;
if ((line & 1) == 0)
pu -= linewidth;
pv -= linewidth;
public static void save(byte[] yuv420, String path, int width, int height,
int quality)
//开始转换,这里需要怎么写了
cvt_420p_to_rgb565();
Bitmap bitmap = Bitmap.createBitmap(bytes, width, height,
Config.RGB_565);
File file2 = new File(path);
try
FileOutputStream out = new FileOutputStream(file2);
if (bitmap.compress(Bitmap.CompressFormat.JPEG, quality, out))
out.flush();
out.close();
catch (Exception e)
参数分别是宽,高,原数据指针,转化后的目标数据指针。
你找的这个函数是用C写的,而你的save(byte[] yuv420, String path, int width, int height,int quality)是JAVA,因此你要使用JNI。或者你把cvt_420p_to_rgb565函数转成JAVA版。
举个例子 使用jni(实际自己测试):
cvt_420p_to_rgb565修改为
#ifdef __cplusplusextern "C"
#endif
JNIEXPORT jobjectArray JNICALL 你的包名_类名_cvt420pToRGB565(JNIEnv * env, jobject obj,jint width, jint height,jcharArray srcData,jcharArray dstData);
#ifdef __cplusplus
;
#endif
JNIEXPORT jobjectArray JNICALL 你的包名_类名_cvt420pToRGB565(JNIEnv * env, jobject obj,jint width, jint height,jcharArray srcData,jcharArray dstData)
unsigned char * src =(unsigned char *) (env-> GetByteArrayElements(srcData, 0));
unsigned char * dst =(unsigned char *) (env-> GetByteArrayElements(dstData, 0));
下面照抄!!
YUV与RGB 以及之间的转换
目录
在视频技术中,通常碰到的两种颜色空间RGB和YUV
一、RGB
指图像的每一个像素都是有R、G、B三个值。
摄像头采集的原始图像和显示器显示的图像都是RGB图像
RGB图像中分量的排序R,G,B,也可能是B、G、R
二、YUV
在视频领域更多使用YUV
Y 亮度信息,是图像的总体轮廓;黑白电视机
UV色彩信息,主要描绘图像的色彩信息。
三、YUV类型和存储方式
1、类型
YUV 4:4:4 每一个Y对应一组UV
YUV 4:2:2 每两个Y共用一组UV
YUV 4:2:0 每四个Y共用一组UV
2、存储方式
planer:Y U V 连续存储
Packed:先存储完所有Y,然后U,V连续的交错存储
四、分析YUV 4:2:0
每上、下、左、右4个像素点共用一个U和一个V。分为以下4种
1、YU12(I420,YUV420P)
这种类型是Planar格式,先存储完Y,再存储U,之后存储V
2、YV12
这种类型是Planar格式,先存储完Y,再存储V,之后存储U
3、NV12(YUV420SP)
这种类型是Packed格式,先存储完Y,之后U,V交错存储。
4、NV21(YUV420SP)
这种类型是Packed格式,先存储完Y,之后V,U交错存储。
5、占用空间大小比较
4X4像素的YUV420只需要24字节,而RGB需要48字节,存储少了一半。
4X4X3(每个点三个字节R,G,B) = 48
五、RGB与YUV之间的转换
1、转换标准
BT709(高清) 和BT601标准(标清)
2、Color Range
一个8bit的RGB,每个分量的范围并不都是 0~255
1)Full Range
范围取值 0~255
2)Limited Range
范围取值 16~235
3、计算公式
BT601 limited range
YUV->RGB
R = Y - 16 + 1.372 * (V - 128)
G = Y - 16 - 0.337 * (U - 128) - 0.699 * (V - 128)
B = Y - 16 + 1.734 * (U - 128)
RGB->YUV
Y = 0.299 * R + 0.587 * G + 0.114 * B + 16
U = -0.173 * R - 0.339 * G + 0.511 * B + 128
V = 0.511 * B - 0.428 * G - 0.083 * B + 128
BT601 full range
YUV->RGB
R = 1.164 * (Y - 16) + 1.596 * (V - 128)
G = 1.164 * (Y - 16) - 0.392 * (U - 128) - 0.812 * (V - 128)
B = 1.164 * (Y - 16) + 2.016 * (U - 128)
RGB->YUV
Y = 0.257 * R + 0.504 * G + 0.098 * B + 16
U = -0.148 * R - 0.291 * G + 0.439 * B + 128
V = 0.439 * R - 0.368 * G - 0.072 * B + 128
BT709 full range
YUV->RGB
R = 1.1644 * (Y - 16) + 1.7928 * (V - 128)
G = 1.1644 * (Y - 16) - 0.2133 * (U - 128) - 0.533 * (V - 128)
B = 1.1644 * (Y - 16) + 2.1124 * (U - 128)
RGB->YUV
Y = 0.1826 * R + 0.6142 * G + 0.0620 * B + 16
U = -0.1006 * R - 0.3386 * G + 0.4392 * B + 128
V = 0.4392 * B - 0.3989 * G - 0.0403 * B + 128
BT709 limit range
YUV->RGB
R = Y + 1.5748 * (V - 128)
G = Y - 0.1881 * (U - 128) - 0.4681 * (V - 128)
B = Y + 1.8556 * (U - 128)
RGB->YUV
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
U = -0.1146 * R - 0.3854 * G + 0.500 * B + 128
V = 0.500 * B - 0.4542 * G - 0.0468 * B + 128
以上是关于android yuv怎么转换成RGB565?的主要内容,如果未能解决你的问题,请参考以下文章