FFmpeg-AVFrame RGB32转BMP

先用ffmpeg将图像进行翻转,得到RGB32的AVFrame,然后将RGB32图像转为BMP。

翻转过程:https://blog.csdn.net/qq_36568418/article/details/113563986

BMP格式详解:https://blog.csdn.net/nicholas_duan/article/details/90717599

转换过程代码:

// bpp->BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32
// 例 RGB32,bpp = 32
int CWPlay::ReFreshFrame(AVFrame * pFrameRGB, int bpp)
{
    //填充BMP图像
	int width = pFrameRGB->width;
	int height = pFrameRGB->height;

	BITMAPFILEHEADER bmpheader;
	BITMAPINFOHEADER bmpinfo;

	bmpheader.bfType = 0x4d42;//必须表示"BM" 
	bmpheader.bfReserved1 = 0;
	bmpheader.bfReserved2 = 0;
	bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
	bmpheader.bfSize = bmpheader.bfOffBits + width * height*bpp / 8;

	bmpinfo.biSize = sizeof(BITMAPINFOHEADER);
	bmpinfo.biWidth = width;
	bmpinfo.biHeight = height;
	bmpinfo.biPlanes = 1;
	bmpinfo.biBitCount = bpp;
	bmpinfo.biCompression = BI_RGB;
	bmpinfo.biSizeImage = (width*bpp + 31) / 32 * 4 * height;
	bmpinfo.biXPelsPerMeter = 100;
	bmpinfo.biYPelsPerMeter = 100;
	bmpinfo.biClrUsed = 0;
	bmpinfo.biClrImportant = 0;
	if (m_hbitmap)
		::DeleteObject(m_hbitmap);

	CDC* dc = GetDC();

	m_hbitmap = CreateDIBitmap(dc->GetSafeHdc(),	//设备上下文的句柄 
		(LPBITMAPINFOHEADER)&bmpinfo,				//位图信息头指针 
		(long)CBM_INIT,								//初始化标志 
		pFrameRGB->data[0],						    //初始化数据指针 
		(LPBITMAPINFO)&bmpinfo,						//位图信息指针 
		DIB_RGB_COLORS);

    //以下将bmp图像绘制到屏幕上
	CDC memDc;
	memDc.CreateCompatibleDC(dc);

	CRect rcClient;
	GetWindowRect(rcClient);

	memDc.SelectObject(m_hbitmap);
	int nleft = (rcClient.Width() - width) / 2;
	int top = (rcClient.Height() - height) / 2;
	dc->StretchBlt(nleft, top, width, height, &memDc, 0, 0, width, height, SRCCOPY);

	memDc.DeleteDC();
	ReleaseDC(dc);
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值