作者:尹嫱AileenDawnYin | 来源:互联网 | 2023-05-19 04:56
BOOLCBMPDoc::OnOpenDocument(LPCTSTRlpszPathName){if(!CDocument::OnOpenDocument(lpszPathName)
BOOL CBMPDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
CFile file;
CFileException er;
BITMAPFILEHEADER bitfilehead;
BITMAPINFOHEADER bitinfohead;
if(!file.Open(lpszPathName,CFile::modeRead|CFile::typeBinary|CFile::shareDenyWrite,&er))
{
ReportSaveLoadException(lpszPathName,&er,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
}
if (!file.Read(&bitfilehead,sizeof(BITMAPFILEHEADER)))
{
AfxMessageBox("读取到内存失败");
return FALSE;
}
if (bitfilehead.bfType!=((WORD)('M'<<8)|'B'))
return FALSE;
if(bitfilehead.bfSize!=file.GetLength())
return FALSE;
if(file.Read((LPSTR)&bitinfohead,sizeof(bitinfohead))!=sizeof(bitinfohead))
return FALSE;
int h=bitinfohead.biHeight;
int w=bitinfohead.biWidth;
file.SeekToBegin();
file.Read(&bitfilehead,sizeof(BITMAPFILEHEADER));
UINT bmplen=(UINT)bitfilehead.bfOffBits-sizeof(BITMAPFILEHEADER);
bitinfo=(LPBITMAPINFO)new BYTE[bmplen];
file.Read((LPVOID)bitinfo,bmplen);
if ((*(LPDWORD)(bitinfo))!=sizeof(BITMAPINFOHEADER))
return FALSE;
DWORD dwbitlen=bitfilehead.bfSize-bitfilehead.bfOffBits;
lpsrcbit=new BYTE[dwbitlen];
file.ReadHuge(lpsrcbit,dwbitlen);
file.Close();
HBITMAP bitmap=::CreateDIBSection(NULL,(BITMAPINFO*)bitinfo,DIB_RGB_COLORS,&lpsrcbit
,NULL,0);
if (bitmap==NULL)
{AfxMessageBox("CreateDIBsentn") ;return FALSE;
}
m_bitmap=new CBitmap;
m_bitmap->Attach(bitmap);
nWidth=bitinfo->bmiHeader.biWidth;
nHeight=bitinfo->bmiHeader.biHeight;
return TRUE;
}
在头文件中!定义的变量!
CBitmap *m_bitmap;
LPBITMAPINFO bitinfo;
LPVOID lpsrcbit;
void CBMPView::OnDraw(CDC* pDC)
{
CBMPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if ( !pDoc->m_bitmap)
{
return;
}
CDC memdc;
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(pDoc->m_bitmap);
pDC->BitBlt(0,0,pDoc->nWidth,pDoc->nHeight,&memdc,0,0,SRCCOPY);
/* ::StretchDIBits(pDC->GetSafeHdc(),0,0,pDoc->nWidth,pDoc->nHeight,0,0,pDoc->nWidth,pDoc->nHeight,
pDoc->lpsrcbit,(LPBITMAPINFO)pDoc->bitinfo,DIB_RGB_COLORS,SRCCOPY);
}
有高手帮看看 解决送分马上1
8 个解决方案
我解决了解决了解决了解决了解决了
但是不知道原因!
解决方法: file.ReadHuge(lpsrcbit,dwbitlen);
把这个函数 就是填充BMP的数据区的操作移到HBITMAP bitmap=::CreateDIBSection(NULL,(BITMAPINFO*)bitinfo,DIB_RGB_COLORS,&lpsrcbit
,NULL,0);
创建句柄后面 就是说在创建后在填充 就好事了!
可是知道怎么解决但 不直达为什么啊
有谁能告诉我为什么??
我象知道原理 和原因 期待解释!!
解答送分!
数据要和调色板建立联系的。可能这方面的原因。
建立调色板是不是不对呀。
真彩色就不用调色板了。
从BITMAPFILEHEADER.bfOffBits 读取bmp数据
楼主给我发一份完整的打开图像显示图像的程序好吗?
我的邮箱是zhengkaa@163.com
楼主给我发一份完整的打开图像显示图像的程序好吗?
我的邮箱是guduhen2003@yahoo.com.cn
深表感谢啊!!!