Windows平台调用系统API渲染视频的3中方法

// GDI
//读取文件
CFile file("D:\\1.bmp", CFile::modeRead);
char* bmpbuf = new char[file.GetLength() + 1];
file.Read(bmpbuf, file.GetLength());
//分析文件
BITMAPFILEHEADER* bmpfileheader = (BITMAPFILEHEADER*)bmpbuf;//文件头
BITMAPINFOHEADER* bmpinfoheader = (BITMAPINFOHEADER*)((char*)bmpbuf + sizeof(BITMAPFILEHEADER));//位图头
BITMAPINFO* bmpinfo = (BITMAPINFO*)bmpinfoheader;//位图信息
CClientDC dc(this);
第一种方法
//StretchDIBits(dc.GetSafeHdc(),0,0,1024,768,0,0,bmpinfoheader->biWidth,bmpinfoheader->biHeight,
//    bmpbuf+bmpfileheader->bfOffBits,bmpinfo,DIB_RGB_COLORS,SRCCOPY);
第二种方法
//void* p = NULL;
//HBITMAP hbmp = CreateDIBSection(dc.GetSafeHdc(),bmpinfo,DIB_RGB_COLORS,&p,NULL,0);//CreateDIBSection
//memcpy(p,bmpbuf+bmpfileheader->bfOffBits,bmpinfoheader->biSizeImage);
//CBitmap bitmap;
//bitmap.Attach(hbmp);
//CDC cmpDC;
//cmpDC.CreateCompatibleDC(&dc);
//CBitmap* oldbmp = cmpDC.SelectObject(&bitmap);
//dc.StretchBlt(0,0,1024,768,&cmpDC,0,0,bmpinfoheader->biWidth,bmpinfoheader->biHeight,SRCCOPY);
//cmpDC.SelectObject(oldbmp);
第三种方法
//HBITMAP hbitmap = CreateDIBitmap(dc.GetSafeHdc(),bmpinfoheader,CBM_INIT,bmpbuf+bmpfileheader->bfOffBits,bmpinfo,DIB_RGB_COLORS);
//CDC cmpDC;
//cmpDC.CreateCompatibleDC(&dc);
//HBITMAP oldbmp = (HBITMAP)::SelectObject(cmpDC.GetSafeHdc(),hbitmap);
//dc.BitBlt(0,0,1024,768,&cmpDC,0,0,SRCCOPY);
//cmpDC.SelectObject(oldbmp);

以上代码转自https://blog.csdn.net/gongluck93/article/details/52813042

有一点错误需要纠正的是在源博文中方法2中存放媒体数据的指针"p",指向的空间是由应用程序自行开辟的,实际上这种方式是错误的依据msdn介绍CreateDIBSection函数的第四个参数是输出参数,不需要程序员自行申请空间,系统会自行申请然后传递出来(依据二级指针其实可以猜测到这一点),释放也不需要程序员手动释放,系统会自行释放。另外上述地址中的博文对bmp格式文件介绍的特别详细,感兴趣的朋友可以自行参阅。

另外需要注意的是上面三个函数渲染视频时视频源的格式需要是bgr24格式而不是我们常用的rgb24格式。否则会出现渲染出来的视频色彩不准确的问题。

再补充,如果我们的源视频图像大小与窗口大小不相等的时候调用StretchDIBits等函数会造成严重失真,此时可通过在StretchDIBits调用前调用
SetStretchBltMode(pDC->m_hDC,STRETCH_HALFTONE);
来解决严重失真的问题。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值