设为首页 加入收藏

TOP

1.4.4 面向对象的DIB的读写及访问——ImgCenterDib类(2)
2013-10-07 00:21:56 来源: 作者: 【 】 浏览:56
Tags:1.4.4 面向 对象 DIB 读写 访问 ImgCenterDib

1.4.4  面向对象的DIB的读写及访问——ImgCenterDib类(2)

4.DIB的文件读入函数——Read()

/******************************************
*****************************
* 函数名称:
*     Read()
*
*函数参数:
*    LPCTSTR lpszPathName-文件名字及路径
*
*返回值:
*    0为失败,1为成功
*
*说明:给定一个图像文件名及其路径,分配内存,读取
图像数据进内存生成DIB,
*      并存放在m_lpDib所指向的缓冲区
**********************************************
*************************/
BOOL ImgCenterDib::Read(LPCTSTR lpszPathName)
{
//读模式打开图像文件
CFile file;
if (!file.Open(lpszPathName, CFile::modeRead
| CFile::shareDenyWrite))
return FALSE;
 BITMAPFILEHEADER bmfh;
try {
//清理空间
Empty();
  //读取BITMAPFILEHEADER结构到变量bmfh中
int nCount=file.Read((LPVOID) &bmfh,
sizeof(BITMAPFILEHEADER));
  //异常判断
if(nCount != sizeof(BITMAPFILEHEADER)) {
throw new CException;
}
if(bmfh.bfType != 0x4d42) {
throw new CException;
}
  //为m_lpDib分配空间,读取DIB进内存
if(m_lpDib!=NULL)
delete []m_lpDib;
m_lpDib=new BYTE[file.GetLength()
-sizeof(BITMAPFILEHEADER)];
file.Read(m_lpDib, file.GetLength()
-sizeof(BITMAPFILEHEADER));
  //m_lpBmpInfoHead位置为m_lpDib起始位置
m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib;
  //为成员变量赋值
m_imgWidth=m_lpBmpInfoHead->biWidth;
m_imgHeight=m_lpBmpInfoHead->biHeight;
m_nBitCount=m_lpBmpInfoHead->biBitCount;
  //计算颜色表长度
m_nColorTableLength=
ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount);
  //生成逻辑调色板
m_hPalette = NULL;
if(m_nColorTableLength!=0){
m_lpColorTable=(LPRGBQUAD)
(m_lpDib+sizeof(BITMAPINFOHEADER));
 MakePalette();
}
  //m_pImgData指向DIB的位图数据起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength;
}
catch(CException* pe) {
AfxMessageBox("Read error");
pe->Delete();
return FALSE;
}
 //函数返回
return TRUE;
}

5.DIB的文件存储函数——Write()


/****************************************
*******************************
* 函数名称:
*     Write()
*
*函数参数:
*    LPCTSTR lpszPathName-指定图像文件名字及路径
*
*返回值:
*    0为失败,1为成功
*
*说明:给定一个图像文件名及其路径,将m_lpDib指向的DIB数据存盘
****************************************
*******************************/
BOOL ImgCenterDib::Write(LPCTSTR lpszPathName)
{
//写模式打开文件
CFile file;
if (!file.Open(lpszPathName, CFile::modeCreate
| CFile::modeReadWrite
| CFile::shareExclusive))
return FALSE;
 //填写文件头结构
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42;  // 'BM'
bmfh.bfSize = 0;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength; 
try {
//文件头结构写进文件
file.Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
  //文件信息头结构写进文件
file.Write(m_lpBmpInfoHead,  sizeof(BITMAPINFOHEADER));
  //如果有颜色表的话,颜色表写进文件
if(m_nColorTableLength!=0)
 file.Write(m_lpColorTable, sizeof(RGBQUAD)
* m_nColorTableLength);
  //位图数据写进文件
int imgBufSize=(m_imgWidth*m_nBitCount/8+3)
/4*4*m_imgHeight;
file.Write(m_pImgData, imgBufSize);
}
catch(CException* pe) {
pe->Delete();
AfxMessageBox("write error");
return FALSE;
}
 //函数返回
return TRUE;
}

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.4.4 面向对象的DIB的读写及访问.. 下一篇1.4.4 面向对象的DIB的读写及访问..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: