现在网上这些人写的要么不对 要么颜色溢出 要么偏黄 偏蓝 偏红 。真的是够了。
试一试下面就知道对不对了。
I420也叫IYUV,也叫YUV420 。 采集卡采集视屏数据通常为I420 经过转换成rgb24后 可以对图像进行各种处理。
下面来说说i420转rgb24:
unsigned char* I420ToRGBA(const unsigned char * src, int width, int height)
{
//我的图片是1920*1080的 你们按照自己*3就可以
unsigned char* rgbA = new unsigned char[1920*1080*3];
int temp = 0;
for(int i=0; i<height; i++){
int startY = i*width;
int step = (i/2)*(width/2);
int startV = positionOfV + step;
int startU = positionOfU + step;
for(int j = 0; j < width; j++){
int Y = startY + j;
int V = startV + j/2;
int U = startU + j/2;
int index = Y*3;
temp = ((src[Y]&0xff) + 1.4075 * ((src[V]&0xff)-128));
rgbA[index+B] = temp<0 ? 0 : (temp > 255 ? 255 : temp);
temp = ((src[Y]&0xff) - 0.3455* ((src[U]&0xff)-128) - 0.7169*((src[V]&0xff)-128));
rgbA[index+G] = temp<0 ? 0 : (temp > 255 ? 255 : temp);
temp = ((src[Y]&0xff) + 1.779* ((src[U]&0xff)-128));
rgbA[index+R] =temp<0 ? 0 : (temp > 255 ? 255 : temp);
}
}
return rgbA;
}
使用方法:
int main(void)
{
// 参数1. 待转换的I420数据 ,参数二 图片宽度 ,参数三 图片的高度 ,返回值 :指向转换后的数据 也就是指向rgb24数据
unsigned char* rgb24 = I420ToRGBA(i420,1920,1080);
delete[] rgb24;
rgb24 = nullptr;
return 0;
}