vc中动态显示bmp
2009-02-22 14:49
225 查看
1:将bmp导入资源中,这是最方便的,但同时也是最不灵活的,而且也费资源。
使用CBitmap 的LoadBmp(...)
2:可以通过
hBitmap=(HBITMAP) ::LoadImage(NULL,picname,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
具体使用可以参考msdn,我一开始接触时 就是用的这个函数。
之后CDC *pDc =GetDC();)
HBITMAP OldBitmap;
CDC MemDC;
CRect rect;
MemDC.CreateCompatibleDC(pDc);
GetClientRect(rect);
OldBitmap=(HBITMAP)MemDC.SelectObject(hBitmap);
pDc->BitBlt(4,4,(rect.Width())-3,(rect.Height())-3,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
MemDC.DeleteDC();
DeleteObject((HGDIOBJ)hBitmap);
就可以在自己喜欢的地方显示bmp图了。如果显示的是灰度图,这样可以不考虑彩色表,本身是什么图(灰度的,彩色的,单色的)它就显示什么图。
3:通过数据数组:从采集卡上采集的都是固定格式的数据。所以没有必要将数据做成bmp图,在通过(2)的方法显示出来---我最初就是用这种方法,很笨的哦。
通过函数:StretchDIBits(*pDc,10,10,640,480,0,0,320,240,tmp_buf,bmpInfoHdr,BI_RGB,SRCCOPY);-(640,480,是将原图扩大到这个象素)。其中tmp_buf 为数据数组的地址,bmpInfoHdr为位图信息。
LPBITMAPINFO bmpInfoHdr= ( )new BYTE[1064];
fread(&bmpFileHdr,sizeof(BITMAPFILEHEADER),1, fp);
fread(&bmpInfoHdr->bmiHeader,40,1, fp);
for(int i=0;i<256;i++)
{
bmpInfoHdr->bmiColors[i].rgbBlue=(BYTE)i;
bmpInfoHdr->bmiColors[i].rgbGreen=(BYTE)i;
bmpInfoHdr->bmiColors[i].rgbRed=(BYTE)i;
bmpInfoHdr->bmiColors[i].rgbReserved=(BYTE)0;
}
由于是灰度图,所以需要自定义彩色表。
*CBitmap 中的 m_bmp.CreateBitmap(320,240,1,255,(BYTE*)tmp_buf);或CreateBitmap(320,240,1,255,(BYTE*)tmp_buf);
都不好用, 原因是 msdn中说的,第三个参数和第四个参数都应为1,才能输出图,并且只能是单色图,还有 m_bmp.CreateBitmapIndirect(&bitmap)。。。CreateCompatibleBitmap等等,这么麻烦,还不一定好用,我还不如不用这个方法了。
最后别忘了要删除bmp图占的空间。如
MemDC.DeleteDC(); DeleteObject((HGDIOBJ)hBitmap); 小程序可能看不来,但是如果是采集卡上输出的数据,不用几十秒,你的内存就让它给吃完了。
1.
CString strFilter = "bmp File (*.bmp)|*.bmp"; CString strFileName; CFileDialog FileDg(true, NULL, NULL, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, strFilter, this); if (IDOK == FileDg.DoModal()) { strFileName = FileDg.GetFileName(); HBITMAP hBitmap; CRect rect; ::GetWindowRect(GetDlgItem(IDC_2)->m_hWnd, &rect); ScreenToClient(&rect); //hBitmap = (HBITMAP)LoadBitmap(NULL, strFileName); hBitmap = (HBITMAP)LoadImage(NULL, strFileName, IMAGE_BITMAP, rect.Width(), rect.Height(), LR_LOADFROMFILE); m_picture.SetBitmap(hBitmap); }
2.
strFileName = FileDg.GetFileName(); CDC* pDC = GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CRect rect; ::GetWindowRect(GetDlgItem(IDC_2)->m_hWnd, &rect); ScreenToClient(&rect); HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, strFileName, IMAGE_BITMAP, rect.Width(), rect.Height(), LR_LOADFROMFILE); HBITMAP hOldBitmap = (HBITMAP)MemDC.SelectObject(hBitmap); pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY); MemDC.DeleteDC(); DeleteObject((HGDIOBJ)hBitmap);
3.
RECT rect; ::GetWindowRect(GetDlgItem(IDC_2)->m_hWnd, &rect); ScreenToClient(&rect); //CString str; //str.Format("%d, %d, %d, %d", rect2.left, rect2.top, rect2.right, rect2.bottom); //MessageBox(str); mSourceFile = dlgOpen.GetPathName(); bool bSuccess = TRUE; HANDLE hFile; DWORD dwFileSize; DWORD dwHighSize; DWORD dwBytesRead; BITMAPFILEHEADER* pBmfh; BITMAPINFO* pBmInfo; BYTE* pBm; int iDibX; int iDibY; hFile = CreateFile(mSourceFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (INVALID_HANDLE_VALUE == hFile) { return; } dwFileSize = GetFileSize(hFile, &dwHighSize); if (dwHighSize) { CloseHandle(hFile); return; } pBmfh = (BITMAPFILEHEADER*)malloc(dwFileSize); if (!pBmfh) { CloseHandle(hFile); return; } bSuccess = ReadFile(hFile, pBmfh, dwFileSize, &dwBytesRead, NULL); CloseHandle(hFile); if (!bSuccess || dwFileSize != dwBytesRead || pBmfh->bfType != * (WORD*) "BM" || pBmfh->bfSize != dwFileSize) { free(pBmfh); return; } this->Invalidate(false); // 取得位图信息结构体的指针和位图数据数组的指针 pBmInfo = (BITMAPINFO*)(pBmfh + 1); pBm = (BYTE*)pBmfh + pBmfh->bfOffBits; // Get the DIB width and height if (pBmInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) { iDibX = ((BITMAPCOREHEADER*)pBmInfo)->bcWidth; iDibY = ((BITMAPCOREHEADER*)pBmInfo)->bcHeight; } else { iDibX = pBmInfo->bmiHeader.biWidth; iDibY = abs(pBmInfo->bmiHeader.biHeight); } PAINTSTRUCT ps; HDC h = ::BeginPaint(this->GetSafeHwnd(), &ps); CRect rec; ::GetWindowRect(GetDlgItem(IDC_2)->m_hWnd, &rec); ScreenToClient(&rec); StretchDIBits(h, rec.left, rec.top, rec.Width(), rec.Height(), 0, 0, iDibX, iDibY, pBm, pBmInfo, DIB_RGB_COLORS, SRCCOPY); ::EndPaint(this->GetSafeHwnd(), &ps);
相关文章推荐
- VC小技巧,窗体中显示bmp图象
- VC 显示jpg,gif,bmp等格式图片
- VC MFC界面上显示BMP图片
- 对话框中显示jpg,bmp图片和对话框动态显示图片
- VC MFC界面上显示BMP图片
- 使用vc显示bmp位图
- 如何在VC中显示动态的GIF
- vc 在edit控件中动态插入数据滚动显示
- VC设置静态文本透明显示,动态更新内容,不重叠
- MFC picture控件显示动态/静态BMP图片
- MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片
- (一)VC保存和显示数据库图像(BMP)
- VC++ 2005中显示jpg,bmp,gif图像的方法
- VC将BMP图片显示在屏幕上(用图片作背景)
- VC用ADO存取显示jpg/bmp位图文件
- vc 界面显示bmp
- VC中导入图像(BMP,JPG,GIF)并显示的方法
- VC数字图像处理编程讲座之四--BMP图像显示的特效操作
- vc 加载bmp位图并显示的方法
- VC中显示ICON和BMP图片