您的位置:首页 > 其它

VC 创建BMP文件并显示

2015-10-26 16:04 337 查看
创建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 本来是用于接收网络传输过来的视频图片然后显示图片。上述代码只是其中一部分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: