通过文件-打开-加载显示图片!为什么显示是黑的!急解决送分!

ufonasa 2007-04-19 02:06:19
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

...全文
470 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
guduhen 2007-05-22
  • 打赏
  • 举报
回复
楼主给我发一份完整的打开图像显示图像的程序好吗?
我的邮箱是guduhen2003@yahoo.com.cn
深表感谢啊!!!
lastwish 2007-04-27
  • 打赏
  • 举报
回复
楼主给我发一份完整的打开图像显示图像的程序好吗?
我的邮箱是zhengkaa@163.com
jiangchyan 2007-04-21
  • 打赏
  • 举报
回复
找到原因了,数据区没读进去
jiangchyan 2007-04-21
  • 打赏
  • 举报
回复
我的读出是白色,也不知是什么原因
Rock_And_Roll 2007-04-20
  • 打赏
  • 举报
回复
数据要和调色板建立联系的。可能这方面的原因。
建立调色板是不是不对呀。
真彩色就不用调色板了。
zcjcom830 2007-04-20
  • 打赏
  • 举报
回复
从BITMAPFILEHEADER.bfOffBits 读取bmp数据
zcjcom830 2007-04-20
  • 打赏
  • 举报
回复
参考CreateDIBSection msdn
ufonasa 2007-04-19
  • 打赏
  • 举报
回复
我解决了解决了解决了解决了解决了
但是不知道原因!
解决方法: file.ReadHuge(lpsrcbit,dwbitlen);
把这个函数 就是填充BMP的数据区的操作移到HBITMAP bitmap=::CreateDIBSection(NULL,(BITMAPINFO*)bitinfo,DIB_RGB_COLORS,&lpsrcbit
,NULL,0);
创建句柄后面 就是说在创建后在填充 就好事了!
可是知道怎么解决但 不直达为什么啊
有谁能告诉我为什么??
我象知道原理 和原因 期待解释!!
解答送分!

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧