本文介绍了分离rgb24视频图像的r、g、b分量的方法,附有详细的代码和图像示例。文中rgb24文件需要使用yuv/rgb播放器才能查看,参考播放器可选择雷神推荐的修改了一个YUV/RGB播放器,或者小编使用的vooya播放器。
rgb24存储方式
与YUV420P三个分量分开存储不同,RGB24格式的每个像素的三个分量是连续存储的。一帧宽高分别为w、h的RGB24图像一共占用wh3 Byte的存储空间。RGB24格式规定首先存储第一个像素的R、G、B,然后存储第二个像素的R、G、B…以此类推。类似于YUV420P的存储方式称为Planar方式,而类似于RGB24的存储方式称为Packed方式。
函数代码
int CTransPic::simplest_rgb24_split(char*url, int w, int h, int num)
{
ifstream ifile;
ifile.open(url, ios::in | ios::binary);
ofstream ofile1, ofile2, ofile3;
ofile1.open("G:\\ffmpeg\\YUV\\output_r.y", ios::out | ios::binary);
ofile2.open("G:\\ffmpeg\\YUV\\output_g.y", ios::out | ios::binary);
ofile3.open("G:\\ffmpeg\\YUV\\output_b.y", ios::out | ios::binary);
unsigned char* pic = (unsigned char*)malloc(w*h * 3);
memset(pic, 0, w*h * 3);
for (int i = 0; i < num; i++)
{
ifile.read((char*)pic, w*h * 3);
for (int j = 0; j < w*h * 3; j += 3)
{
#if simplest_rgb24_split_ctrol_method_1
ofile1 << pic[j];
ofile2 << pic[j + 1];
ofile3 << pic[j + 2];
#else
ofile1.write((const char*)(pic + j), 1);
ofile2.write((const char*)(pic + j + 1), 1);
ofile3.write((const char*)(pic + j + 2), 1);
#endif
}
}
free(pic);
ifile.close();
ofile1.close();
ofile2.close();
ofile3.close();
return 0;
}
上面代码中提供了两种将r、g、b分量分别写入文件的方式,通过宏开关simplest_rgb24_split_ctrol_method_1来控制具体使用哪种方式。函数调用方式如下所示。
TranPic.simplest_rgb24_split("..\\2_1000x667.rgb", 1000, 667, 1);
测试用例
程序测试用的原图如下所示:
程序测试输出结果如下图所示。其中,r、g、b分量通过播放器的y通道进行查看。
下载
vooya播放器:https://download.csdn.net/download/whegqing/11519824
测试用例图:https://download.csdn.net/download/whegqing/11520875
版本声明:本文参考了雷神的文章,文中代码重新做了编写,亲测可用,欢迎转载交流。