在MyDOC类中我这样写了,是参考书上的:
变量是这样的
public:
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
RGBQUAD* quad;
BYTE* lpBuf;
BITMAPINFO* pbi;
int flag;
int numQuad;意思都很清楚,不用注释了
void CNewDoc::OnFileOpen()
{ char szFilter[]="bmp files(*.bmp)|*.bmp||";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
CString filename;
CFile file;
if (dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
if (file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
{
AfxMessageBox("无法打开 ",MB_OK,0);
return;
} file.Read(&bf,sizeof(bf));
if (bf.bfType!=0x4d42)
{
AfxMessageBox("非BMP文件",MB_OK,0);
return;
} if (file.GetLength()!=bf.bfSize)
{
AfxMessageBox("文件损坏!",MB_OK,0);
return;
} file.Read(&bi,sizeof(bi)); numQuad=0;
if (bi.biBitCount<24)
numQuad=1<<bi.biBitCount; pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof (BITMAPINFOHEADER+numQuad*sizeof(RGBQUAD)); memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)(BYTE*)pbi+sizeof(BITMAPINFOHEADER);
if(numQuad!=0)
file.Read(quad,sizeof(RGBQUAD)*numQuad);
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage); file.Read(lpBuf,bi.biSizeImage); file.Close();
flag=1; }
}
上面的代码把图像的信息读入各变量中,现在在MyView类中用SetDIBitsToDevice怎么显示图片?
我写的显示代码是这样的,可是就是显示不了呀,请看一下是哪出错了:
void CNewView::OnDraw(CDC* pDC)
{
CPaintDC dc(this);
CNewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here if (pDoc->flag==1)
{
SetDIBitsToDevice(dc.m_hDC,
0,
0,
pDoc->bi.biWidth,
pDoc->bi.biHeight,
0,
0,
0,
pDoc->bi.biHeight,
pDoc->lpBuf,
pDoc->pbi,
DIB_RGB_COLORS);
}
}到底是哪 出错了!!
变量是这样的
public:
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
RGBQUAD* quad;
BYTE* lpBuf;
BITMAPINFO* pbi;
int flag;
int numQuad;意思都很清楚,不用注释了
void CNewDoc::OnFileOpen()
{ char szFilter[]="bmp files(*.bmp)|*.bmp||";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
CString filename;
CFile file;
if (dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
if (file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
{
AfxMessageBox("无法打开 ",MB_OK,0);
return;
} file.Read(&bf,sizeof(bf));
if (bf.bfType!=0x4d42)
{
AfxMessageBox("非BMP文件",MB_OK,0);
return;
} if (file.GetLength()!=bf.bfSize)
{
AfxMessageBox("文件损坏!",MB_OK,0);
return;
} file.Read(&bi,sizeof(bi)); numQuad=0;
if (bi.biBitCount<24)
numQuad=1<<bi.biBitCount; pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof (BITMAPINFOHEADER+numQuad*sizeof(RGBQUAD)); memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)(BYTE*)pbi+sizeof(BITMAPINFOHEADER);
if(numQuad!=0)
file.Read(quad,sizeof(RGBQUAD)*numQuad);
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage); file.Read(lpBuf,bi.biSizeImage); file.Close();
flag=1; }
}
上面的代码把图像的信息读入各变量中,现在在MyView类中用SetDIBitsToDevice怎么显示图片?
我写的显示代码是这样的,可是就是显示不了呀,请看一下是哪出错了:
void CNewView::OnDraw(CDC* pDC)
{
CPaintDC dc(this);
CNewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here if (pDoc->flag==1)
{
SetDIBitsToDevice(dc.m_hDC,
0,
0,
pDoc->bi.biWidth,
pDoc->bi.biHeight,
0,
0,
0,
pDoc->bi.biHeight,
pDoc->lpBuf,
pDoc->pbi,
DIB_RGB_COLORS);
}
}到底是哪 出错了!!
Bitmap=NULL;
BITMAPINFOHEADER* pbfh;
unsigned long Length;
m_VFWImageProc.CaptureDIB(&Bitmap,0,&Length); //这里是获得图象数据 pbfh=&(Bitmap->bmiHeader);
this->bmpData=(char *)Bitmap;
this->bmpData+=m_VFWImageProc.CalcBitmapInfoSize(*pbfh);
int ret = 0;
// Paint the image to the device.
ret = SetDIBitsToDevice (
dcSrc->m_hDC /*hdc*/,
0/*x*/,
0/*y*/,
m_FrameX/*Width*/,
m_FrameY/*Height*/,
0,0,0,
m_FrameY/*Height*/,
(LPVOID)(bmpData),
Bitmap/*pbmi*/,
0);
delete Bitmap;然后BITBLT一下应该可以了吧?
0,
0,
pDoc->bi.biWidth,
pDoc->bi.biHeight,
0,
0,
0,
pDoc->bi.biHeight,
pDoc->lpBuf,
pDoc->pbi,
DIB_RGB_COLORS);
中的pDoc->pbi里面没有调色板信息(如果不是真彩色的话是画不出来的),你把读出来的调色板信息拷贝到pDoc->pbi的BITMAPINFOHEADER后再试试,
我也有个类似的程序,看看能不能给你帮助,memcpy(GetPalette(),pal,min(GetPaletteSize(),bi.biClrUsed*sizeof(RGBQUAD)));
if(8==wBitCount)
{
pal=(RGBQUAD*)calloc(256,sizeof(RGBQUAD));
for (DWORD i=0; i<bi.biClrUsed; i++)
{
pal[i].rgbRed = pal[i].rgbGreen = pal[i].rgbBlue = (BYTE)(i*(255/(bi.biClrUsed-1)));
}
}
/////////////////////////////////////////////////////////////////////////////////
/*$功能:返回要创建的位图的大小$*/
long CImage::GetSize()
{
return bi.biSize + GetPaletteSize();}
/////////////////////////////////////////////////////////////////////////////////
/*$功能:返回要创建的位图的调色板大小$*/
DWORD CImage::GetPaletteSize()
{
return (bi.biClrUsed * sizeof(RGBQUAD));}
/////////////////////////////////////////////////////////////////////////////////
/*$功能:返回位图调色板的位置$*/
RGBQUAD* CImage::GetPalette()
{
if ((pDib)&&(bi.biClrUsed))
return (RGBQUAD*)((BYTE*)pDib + sizeof(BITMAPINFOHEADER));
return NULL;}