- bool CffmpegView::RGB2YUV420()
- {
- FILE *pFile;
- uint8_t * <span style="BACKGROUND-COLOR: #ffffff">RgbBuf</span>
- BITMAPFILEHEADER bmfh; //文件头
- BITMAPINFOHEADER bmih;//文件信息头
- char * strFileName =("a.bmp");
- pFile=fopen(strFileName,"r");
- fread(&bmfh, sizeof(BITMAPFILEHEADER),1,pFile);
- fseek(pFile, sizeof(BITMAPFILEHEADER),SEEK_SET);
- fread(&bmih, sizeof(BITMAPINFOHEADER),1,pFile);
- RgbBuf = new uint8_t [bmih.biWidth*bmih.biHeight*3]; //像素空间
- fseek(pFile,54,SEEK_SET);//图像是24位的,没有调色板。54个字节后就是图像数据
- fread(RgbBuf, (bmih.biWidth * bmih.biHeight * 3),1,pFile);
- yuvBuf=new uint8_t[bmih.biWidth*bmih.biHeight*1.5];//YUV空间
- nWidth=bmih.biWidth;
- nHeight=bmih.biHeight;
- /下面转换算法是网上查到的
- int i, j;
- bufY = yuvBuf;
- bufU = yuvBuf + nWidth * nHeight;
- bufV = bufU + (nWidth* nHeight* 1/4);
- Y=bufY;
- U=bufU;
- V=bufV;
- unsigned char y, u, v, r, g, b,testu,testv;
- for (j = 0; j<nHeight;j++)
- {
- bufRGB = RgbBuf + nWidth * (nHeight - 1-j) * 3 ;
- for (i = 0;i<nWidth;i++)
- {
- int pos = nWidth * i + j;
- r= *(bufRGB++);
- g = *(bufRGB++);
- b = *(bufRGB++);
- y =(unsigned char)(( 66 * r + 129 * g + 25 * b + 128) >>8) + 16;//16
- v = (unsigned char)((-38 * r - 74 * g + 112 * b + 128) >>8) +128 ; //128
- u = (unsigned char)((112 * r - 94 * g - 18 * b + 128) >> 8) + 128 ;
- *(bufY++)=max(0,min(y, 255 ));
- if (j%2==0&&i%2 ==0)
- {
- if (u>255)
- {
- u=255;
- }
- if (u<0)
- {
- u = 0;
- }
- *(bufU++) =u;
- //存u分量
- }
- else
- {
- //存v分量
- if (i%2==0)
- {
- if (v>255)
- {
- v = 255;
- }
- if (v<0)
- {
- v = 0;
- }
- *(bufV++) =v;
- }
- }
- }
- }
- return true;
- } </span>
- <span style="font-size:18px;">uint8_t *rgb_src[3]= {rgb, NULL, NULL};
- int rgb_stride[3]={3*bmih.biWidth, 0, 0};
- AVFrame picture;
- avpicture_alloc((AVPicture*)(&picture), AV_PIX_FMT_YUV420P,bmih.biWidth,bmih.biHeight);
- 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);
- sws_scale(yuvContext,rgb_src, rgb_stride, 0, bmih.biHeight, picture.data, picture.linesize);</span>