项目中碰到了YUV420 planer格式转BGR24的要求(原文中写为RGB24,但实际应为BGR),BGR格式可直接应用于opencv,发现网上涉及这方面的内容不少,但能用的代码非常少,据说最新的opencv 已经可以实现这一功能,下面的代码在项目中可用,转换成功;

标记一下,防止以后再次用到;

unsigned char clip(int valid){
  return valid<0 ? 0 : valid>255 ? 255 : valid;
}
void yuv2bgr(unsigned char *rgbout,unsigned char *yuvin, int width,int height){
    int x,y;
 int temp=0;

unsigned long  idx=0;
    unsigned char *ybase,*ubase,*vbase;
    unsigned char Y,U,V;
 //分别得到y、u、v分量的指针;planar format
    ybase=yuvin;
    ubase=ybase+width*height;
    vbase=ubase+(width*height)/4;
 for(y=0;y<Height;y++){
  idx=(Height-y-1)*Width*3;//该值保证所生成的rgb数据逆序存放在rgbbuf中
  //printf("this is %dth x and index is %d!!!!!!\n",x,idx);
        for(x=0;x<Width;x++){
             Y=ybase[y*Width+x];
             U=ubase[(y/2)*(Width/2)+x/2];//注意UV分量的取值方法,y/2的含义
             V=vbase[(y/2)*(Width/2)+x/2];
   
             temp=(int)(Y+1.771*(U - 128));
    rgbout[idx++]=clip(temp);

temp=(int)(Y-0.7145*(V - 128)-0.3456*(U - 128));
    rgbout[idx++]=clip(temp);

temp=(int)(Y+ 1.4022*(V - 128));
    rgbout[idx++]=clip(temp);

}
 }
}

int writebmp(char *filename,unsigned char *rgbbuf,int width,int height){
   BITMAPFILEHEADER bmpHeader;
   BITMAPINFOHEADER bmpInfo;
   int linebyte=width*3;//(width*3+3)/4*4;
   int rgb_size=linebyte*height;
   int count;
   unsigned long k=0;
   FILE *bmpfp;
   memset(&bmpHeader,0,sizeof(BITMAPFILEHEADER));
   memset(&bmpInfo,0,sizeof(BITMAPINFOHEADER));
   bmpHeader.bfType=0x4D42;//"MB"
   bmpHeader.bfSize=rgb_size+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
   bmpHeader.bfReserved1=0;
   bmpHeader.bfReserved2=0;
   bmpHeader.bfOffBits=54;//sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFODEADER);
  
   bmpInfo.biSize=sizeof(BITMAPINFOHEADER);
   bmpInfo.biWidth=width;
   bmpInfo.biHeight=height;
   bmpInfo.biPlanes=1;
   bmpInfo.biBitCount=24;
   bmpInfo.biCompression=BI_RGB;
   bmpInfo.biSizeImage=rgb_size;
   bmpInfo.biXPelsPerMeter=0;
   bmpInfo.biYPelsPerMeter=0;
   bmpInfo.biClrUsed=0;
   bmpInfo.biClrImportant=0;
   bmpfp=fopen(filename,"wb");
   if(bmpfp==NULL){
        printf("Failed to open file %s\n",filename);
        return -1;
   }
  
   count=fwrite(&bmpHeader,sizeof(BITMAPFILEHEADER),1,bmpfp);
   if(count!=1){
        printf("Failed  to write bmpheader to file the count is %d\n",count);
        return -1;                             
   }
   count=fwrite(&bmpInfo,sizeof(BITMAPINFOHEADER),1,bmpfp);
   if(count!=1){
        printf("Failed  to write bmpinfo to file the count is %d %d\n",count,sizeof(BITMAPINFOHEADER));
        fclose(bmpfp);
        return -1;                             
   }
   count=fwrite(rgbbuf,1,rgb_size,bmpfp);
   if(count!=rgb_size){
        printf("Failed to write rgbbuf to file the count is %d\n",count);
        fclose(bmpfp);
        return -1;                             
   }
   fclose(bmpfp);

return 1;
  
}

int main(){
 int i;
    FILE *file_in;
    int yuvsize=Width*Height*3/2;
 int count;
    unsigned char *yuvbuf;
 unsigned char *rgbbuf;
    char bmpfilename[]="first.bmp";
    file_in=fopen("D:\\work\\yuv2rgb\\foreman_cif.yuv","rb");
    if(file_in==NULL){
         printf("failed to open file\n");
         return;
    }
    yuvbuf=(unsigned char*)malloc(yuvsize);
 rgbbuf=(unsigned char*)malloc(Width*Height*3);
 memset(yuvbuf,0,yuvsize);
 memset(rgbbuf,0,Width*Height*3);
    if(yuvbuf==NULL){
         printf("failed to malloc the yuv buffer\n");
         return;           
    }
 if(rgbbuf==NULL){
         printf("failed to malloc the rgb buffer\n");
         return;           
    }
    fseek(file_in,0, SEEK_CUR);//移动文件指针的位置
    count=fread(yuvbuf,yuvsize,1,file_in);
 if(count!=1){
  printf("failed to read yuv data!\n");
  return;
 }
 fclose(file_in);
    for(i=0;i<1;i++){
       printf("Frame number is %d\n",i);
       yuv2rgb(rgbbuf,yuvbuf,Width,Height);
    if(writebmp(bmpfilename,rgbbuf,Width,Height)==1)
        printf("Success to generate a bmp file\n");

}
    free(yuvbuf);
 free(rgbbuf);
}

转自:http://yumingfu.blog.163.com/blog/static/17507717720126307641853/

yuv420(planer) to bgr24 to bmp相关推荐

  1. 增加录像时间戳水印、 camera框架介绍

    最近项目上要在mtk6589机器上增加录像的水印功能,那个纠结呀--  一大通 度娘.google啊-- 最终整个变通的方案:做好10几个bmp(8位深度黑底白字)贴图,把文件使用ue去除掉bmp文件 ...

  2. android录像增加时间记录(源码里修改)

    需要做一个功能,录像和播放时都显示录时的时间,参考文章链接找不到了,不好意思,这里记录一下,防止下次找不到了.另一篇关于源码录像的流程请参考 http://www.verydemo.com/demo_ ...

  3. 录像的视频如何在画面中实时加上时间戳

    方法一(L之前版本): 可以在下面这个地方同,即MDP输出这个画面,但是Encode之前,使用SW的方式来Overlay即可,至于具体如何实现Overlay的话,网上搜索一下,很多示例代码的.如下的参 ...

  4. Camera 之相关 YUV 知识点总结

    前言 在调试cam sensor 的过程中,不可避免的会碰到yuv相关的功能点.调试效果可能需要dump yuv 图,自己做预览需要对yuv进行转换显示等. 这里主要是对yuv的基础概念 .分类标准. ...

  5. YUV420存储为BMP和JPG图片

    网上大多数关于YUV420的资料都是关于YUV420P的,很少有YUV420SP的,因为YUV420SP的UV是交错存放的,处理起来相对麻烦点,但是YUV420SP也是一种常见格式,因此,在这里,我将 ...

  6. FFmpeg开发实战(五):bmp转换为jpeg格式图像

    文章目录 1. bmp结构 2. bgr24转yuv420p 3. yuv420转jpeg 4. 下载 本文介绍了将bmp格式图像转换为jpeg格式图像的方法,附有详细的代码和图像示例. 1. bmp ...

  7. 视频图像数据处理八:将rgb视频图像转换为yuv420格式视频图像

    文章目录 转换公式 需要注意 函数代码 测试用例 下载 本文介绍了将rgb视频图像转换为yuv420格式视频图像的方法,附有详细的代码和图像示例.文中rgb24和yuv420文件需要使用yuv/rgb ...

  8. RGB、YUV、NV21、BMP相互转换

    概述 最近学习雷神的博客,深受启发.后面的代码或者借鉴原作的代码,或者修改自原作.一般的图片播放器无法显示rgb和yuv格式的图片,为了方便查看rgb和yuv图片,雷神修改了一个网上的YUV/RGB播 ...

  9. java rgb to yuv420_RGB to YUV420转换

    说明:下面的代码用C\C++执行都可以,用C的时候请把#include 删除. RGB to YUV420 原代码:  RGB2YUV.CPP文件 #include #include #include ...

最新文章

  1. 高并发的核心技术 - 幂等的实现方案
  2. 怎么快速把语音转成文字
  3. IPSEC造成网络Destination host unreachable
  4. HandlerThread原理与应用
  5. 天天象棋 残局闯关 第17关
  6. JAVA国际化输出日期格式
  7. redis存储数据类型_Redis与Memcahe的区别最全整理
  8. ASP.NET企业开发框架IsLine FrameWork系列之一--第一次的亲密接触
  9. 泸州市的电子计算机学校名称,泸州电子计算机机械学校2020年招生简介
  10. 中国大数据与智能计算产业联盟“开源软件工作委员会”成立会议在京召开
  11. flask之--钩子,异常,上下文,flask-script,模板,过滤器,csrf_token
  12. 非线性方程求解 matlab,MATLAB应用 求解非线性方程
  13. 在win7中chm打不开的方法
  14. 《仿人机器人原理与实战》一第2章
  15. 使用FFmpeg将amr格式文件转换为MP3格式,结果为空的解决办法
  16. python 时间模块判断上午还是下午_Python的时间模块小结(转自:不懂真人)
  17. arc64,x86等架构linux,windows系统openjdk下载
  18. Error: recoverUnfinalizedSegments failed for required journal
  19. 获取所有复选框选中状态的id
  20. C#读取和写入文件(干货分享)

热门文章

  1. vue+axios方法封装(restful,ajax)
  2. 最详细的PCL编译安装流程
  3. [转]QT QDateTime类、QTimer类
  4. 《机器学习实战》程序清单3-4 创建树的函数代码
  5. Oracle数据库的状态查询
  6. Java集合Map与其子类回顾
  7. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
  8. 解决Unable to locate theme engine in module_path: pixmap
  9. 12-22 挑战留给自己,积极面对
  10. 原型设计模式及深拷贝