您的位置:首页 > 其它

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  byte null image colors file fp