| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 549 人关注过本帖
标题:[求助]读取BMP数据
取消只看楼主 加入收藏
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
 问题点数:0 回复次数:0 
[求助]读取BMP数据

程序代码:

class ...Doc
{
...
public:
BITMAPINFOHEADER m_bih;
RGBQUAD *m_pQuad;
BYTE *m_lpBuf;
BITMAPINFO *m_pbi;
int m_nFlags; //记录状态:是否有数据读取
int m_nQuad; //表示调色板的数量
...
};



void CBmpViewDoc::OnFileOpen()
{
LPCTSTR lpszFilter=_T(\"BMP Files(*.bmp)|*.bmp|任何文件*.*||\");
CFileDialog fileDlg(TRUE,lpszFilter,NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,lpszFilter,NULL);
CString filename;
CFile file;
BITMAPFILEHEADER bf;

if (IDOK==fileDlg.DoModal())
{
filename=fileDlg.GetPathName();
// AfxMessageBox((LPCTSTR)filename);
if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
{
AfxMessageBox(_T(\"无法打开文件!\"));
return;
}
//读取文件头
file.Read(&bf,sizeof(bf));

if (bf.bfType!=0x4d42)//判断是否为BMP文件
{
AfxMessageBox(_T(\"非BMP文件!\"));
return;
}
if (file.GetLength()!=bf.bfSize)
{
AfxMessageBox(_T(\"文件损坏!\"));
return;
}
//读取信息头
file.Read(&m_bih,sizeof(m_bih));
/* CString str;
str.Format(_T(\"%d位\"),m_bih.biBitCount);
AfxMessageBox(str);*/

m_nQuad=0;
if (m_bih.biBitCount<24)
{
m_nQuad=1<<m_bih.biBitCount;
}


//为BITMAPINFO结构类型指针分配内存
m_pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,
m_nQuad*sizeof(RGBQUAD)+sizeof(BITMAPINFOHEADER));

//将信息头放进这快内存,首对齐
memcpy(m_pbi,&m_bih,sizeof(m_bih));

//将调色板指针指向BITMAPINFO指针指向的一大快内存中属于自己的那部分的起点
m_pQuad=(RGBQUAD*)((BYTE*)m_pbi+sizeof(BITMAPINFOHEADER));

//读取调色板信息
if (m_nQuad!=0)
{
file.Read(m_pQuad,m_nQuad*sizeof(RGBQUAD));
}


m_bih.biSizeImage=bf.bfSize-bf.bfOffBits;
m_lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,m_bih.biSizeImage);

//读取图象数据内容
file.Read(m_lpBuf,m_bih.biSizeImage);

//读取完毕,关闭文件。
file.Close();

//读取成功
m_nFlags=1;

//显示
UpdateAllViews(NULL,0,NULL);
}


// CBmpViewView 消息处理程序

void CBmpViewView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CView::OnPaint() for painting messages
CBmpViewDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);

if (pDoc->m_nFlags==1)
{
SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->m_pbi->bmiHeader.biWidth,
pDoc->m_pbi->bmiHeader.biHeight,0,0,0,pDoc->m_pbi->bmiHeader.biHeight,
pDoc->m_lpBuf,pDoc->m_pbi,DIB_RGB_COLORS);
}
}


为什么我读出来的全是黑色啊?

搜索更多相关主题的帖子: BMP 数据 
2006-09-16 12:13
快速回复:[求助]读取BMP数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050091 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved