BMP24转YUV420P

  1. bool CffmpegView::RGB2YUV420()
  2. {  
  3.     FILE *pFile;  
  4.     uint8_t * <span style="BACKGROUND-COLOR: #ffffff">RgbBuf</span>  
  5.     BITMAPFILEHEADER bmfh; //文件头             
  6.     BITMAPINFOHEADER bmih;//文件信息头  
  7.     char * strFileName =("a.bmp");   
  8.     pFile=fopen(strFileName,"r");     
  9.     fread(&bmfh, sizeof(BITMAPFILEHEADER),1,pFile);    
  10.     fseek(pFile, sizeof(BITMAPFILEHEADER),SEEK_SET);   
  11.     fread(&bmih, sizeof(BITMAPINFOHEADER),1,pFile);  
  12.     RgbBuf = new uint8_t [bmih.biWidth*bmih.biHeight*3]; //像素空间   
  13.     fseek(pFile,54,SEEK_SET);//图像是24位的,没有调色板。54个字节后就是图像数据  
  14.     fread(RgbBuf, (bmih.biWidth * bmih.biHeight * 3),1,pFile);  
  15.     yuvBuf=new uint8_t[bmih.biWidth*bmih.biHeight*1.5];//YUV空间  
  16.     nWidth=bmih.biWidth;  
  17.     nHeight=bmih.biHeight;  
  18.     /下面转换算法是网上查到的  
  19.     int i, j;   
  20.     bufY = yuvBuf;   
  21.     bufU = yuvBuf + nWidth * nHeight;   
  22.     bufV = bufU + (nWidth* nHeight* 1/4);   
  23.     Y=bufY;  
  24.     U=bufU;  
  25.     V=bufV;  
  26.     unsigned char y, u, v, r, g, b,testu,testv;   
  27.     for (j = 0; j<nHeight;j++)  
  28.     {  
  29.         bufRGB = RgbBuf + nWidth * (nHeight - 1-j) * 3 ;   
  30.         for (i = 0;i<nWidth;i++)  
  31.         {  
  32.             int pos = nWidth * i + j;  
  33.             r= *(bufRGB++);  
  34.             g = *(bufRGB++);  
  35.             b = *(bufRGB++);  
  36.             y =(unsigned char)(( 66 * r + 129 * g +  25 * b + 128) >>8) + 16;//16  
  37.             v = (unsigned char)((-38 * r -  74 * g + 112 * b + 128) >>8) +128  ; //128            
  38.             u = (unsigned char)((112 * r -  94 * g -  18 * b + 128) >> 8) + 128 ;  
  39.             *(bufY++)=max(0,min(y, 255 ));  
  40.   
  41.             if (j%2==0&&i%2 ==0)  
  42.             {  
  43.                 if (u>255)  
  44.                 {  
  45.                     u=255;  
  46.                 }  
  47.                 if (u<0)  
  48.                 {  
  49.                     u = 0;  
  50.                 }  
  51.                 *(bufU++) =u;  
  52.                 //存u分量  
  53.             }  
  54.             else  
  55.             {  
  56.                 //存v分量  
  57.                 if (i%2==0)  
  58.                 {  
  59.                     if (v>255)  
  60.                     {  
  61.                         v = 255;  
  62.                     }  
  63.                     if (v<0)  
  64.                     {  
  65.                         v = 0;  
  66.                     }  
  67.                     *(bufV++) =v;  
  68.                 }  
  69.             }  
  70.   
  71.         }  
  72.     }  
  73.     return true;  
  74. } </span>  
第二种方法 用FFMPEG
  1. <span style="font-size:18px;">uint8_t *rgb_src[3]= {rgb, NULL, NULL};  
  2. int rgb_stride[3]={3*bmih.biWidth, 0, 0};  
  3. AVFrame picture;  
  4. avpicture_alloc((AVPicture*)(&picture), AV_PIX_FMT_YUV420P,bmih.biWidth,bmih.biHeight);  
  5. SwsContext *yuvContext=sws_getContext(bmih.biWidth,bmih.biHeight,  AV_PIX_FMT_RGB24,bmih.biWidth,bmih.biHeight,AV_PIX_FMT_YUV420P,SWS_BICUBIC, NULL, NULL, NULL);  
  6. sws_scale(yuvContext,rgb_src, rgb_stride, 0, bmih.biHeight, picture.data, picture.linesize);</span>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值