VC 创建BMP文件并显示

创建MFC CSTatic的pciture插件 设置为Frame

1 在头文件中初始化BMP文件头信息变量:

BITMAPFILEHEADERm_bmfHeader;
BITMAPINFOHEADERm_bmiHeader;
LPBYTE *lpbbmData;
BITMAPINFO *bmInfo;
UINT Width = 1024;
UINT Height = 768;


2 设置定时器:

SetTimer(1, 55, NULL);


3 初始化BMP文件信息

//m_bmfHeader
m_bmfHeader.bfType = 0x4D42;
m_bmfHeader.bfOffBits = 0x36;
m_bmfHeader.bfSize = 3 * Width * Height + m_bmfHeader.bfOffBits;
m_bmfHeader.bfReserved1 = 0;
m_bmfHeader.bfReserved2 = 0;


//m_bmiHeader
m_bmiHeader.biSize = sizeof(BITMAPINFOHEADER); //指示 文件信息头大小
m_bmiHeader.biWidth = Width; //图片宽度
m_bmiHeader.biHeight = Height; //图片高度
m_bmiHeader.biPlanes = 1;
m_bmiHeader.biBitCount = 24; //图片位数,位24位图
m_bmiHeader.biCompression = 0; //表示没有压缩  //因为没有压缩,所以可以设置为0
m_bmiHeader.biSizeImage = WIDTHBYTES(Width * m_bmiHeader.biBitCount) * Height;
m_bmiHeader.biXPelsPerMeter = 0x0;
m_bmiHeader.biYPelsPerMeter = 0x0;
m_bmiHeader.biClrUsed = 0; //表明使用所有索引色
m_bmiHeader.biClrImportant = 0; //说明对图象显示有重要影响的颜色索引的数目,0表示都重要。
//以上共占据14+16+24个字节
bmInfo = new BITMAPINFO;
bmInfo->bmiHeader = m_bmiHeader;
bmInfo->bmiColors->rgbBlue = 0x0;
bmInfo->bmiColors->rgbGreen = 0x0;
bmInfo->bmiColors->rgbRed = 0x0;
bmInfo->bmiColors->rgbReserved = 0x0;

lpbbmData = new LPBYTE[Height];


4 设置RGB像素

BOOL CShowPicDlg::CreatePic(UINT Width, UINT Height)
{
int i = 0, j = 0;
int WidthBytes = WIDTHBYTES(m_bmiHeader.biBitCount * m_bmiHeader.biWidth);

for (i = 0; i < Height; i++)
{
lpbbmData[i] = new BYTE[WidthBytes];
for (j = 0; j < WidthBytes / 3; j++)
{
lpbbmData[i][3 * j + 0] = (char)(1 * j + 2 * iTimerCount);
lpbbmData[i][3 * j + 1] = (char)(2 * j + 2 * iTimerCount);
lpbbmData[i][3 * j + 2] = (char)(3 * j + 2 * iTimerCount);
}
}

CClientDC cPicDc(GetDlgItem(IDC_STATIC_PICTURE));

CDC *pcPicDc;
CWnd *pWnd = GetDlgItem(IDC_STATIC_PICTURE);
pcPicDc = pWnd->GetDC();

for (i = 0; i < m_bmiHeader.biHeight; i++)
{
SetDIBitsToDevice(cPicDc, 0, 0, m_bmiHeader.biWidth, m_bmiHeader.biHeight, 0, 0, i, 1, lpbbmData[i], bmInfo, DIB_RGB_COLORS);
}

//for (i = 0; i < Height; i++)
//{
// free(lpbbmData[i]);
//}

return TRUE;
}


5 定时器函数

void CShowPicDlg::OnTimer(UINT_PTR nIDEvent)
{
iTimerCount ++;

QueryPerformanceFrequency(&m_nFreq);
QueryPerformanceCounter(&m_nBeginCount);
CreatePic(1024, 768);

//ShowPic(iTimerCount);
QueryPerformanceCounter(&m_nEndCount);

m_dTimer = (double)(((double)(m_nEndCount.QuadPart) - (double)(m_nBeginCount.QuadPart)) / (double)(m_nFreq.QuadPart));

if (iTimerCount == 4)
{
iTimerCount = 0;
}
}


注意事项:

1 计算每次初始化图片数据和显示所花的时间,再设置定时器的时间。

2 如果BMP图片的相关参数变量使用的局部变量,再每次显示完数据后需要释放内存。因此最好使用全局变量,不用每次分配内存、释放内存,比较耗费时间。

3 本来是用于接收网络传输过来的视频图片然后显示图片。上述代码只是其中一部分

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值