读取位图的类

今天写了一个读取位图的类,体会到了一个类的分装性,当一个数据成员是protected类型时,我们在类中专门写了一个函数来访问这个变量,如同c#中的属性与方法。

////

这是位图类的头文件

Dib.h: interface for the CDib class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DIB_H__ACDEA2B4_090A_4299_AB15_3970423DEC4C__INCLUDED_)
#define AFX_DIB_H__ACDEA2B4_090A_4299_AB15_3970423DEC4C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CDib:public CObject
{
public:
 CDib();
 virtual ~CDib();
protected:
 LPBITMAPFILEHEADER m_pBmFileHeader;
 LPBITMAPINFO m_pBmInfo;
 LPBITMAPINFOHEADER m_pBmInfoHeader;
 RGBQUAD * m_pRGBTable;
 BYTE* m_pDibBits;
 UINT m_numColors;
public:
 BYTE* GetDibBitsPtr();
 LPBITMAPINFO GetDIbInfoPtr();
 LPBITMAPINFOHEADER GetDibInfoHeaderPtr();
 UINT GetDibHeight();
 UINT GetDibWidth();
 DWORD GetDibSizeImage();
 CDib(const char *fileNmae);
protected:
 void LoadBitmapFile(const char* fileName);
};

#endif // !defined(AFX_DIB_H__ACDEA2B4_090A_4299_AB15_3970423DEC4C__INCLUDED_)

这是cpp文件s

//// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Open.h"
#include "Dib.h"
#include "windowsX.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDib::CDib()
{
 m_pBmFileHeader=NULL;
 m_pBmInfo=NULL;
 m_pBmInfoHeader=NULL;
 m_pRGBTable=0;
 m_pDibBits=0;
}
CDib::CDib(const char * fileName)
{
 LoadBitmapFile(fileName);
}

CDib::~CDib()
{
GlobalFree(m_pBmInfo);
}
void CDib::LoadBitmapFile(const char *fileName)
{
 CFile file(fileName,CFile::modeRead);
 BITMAPFILEHEADER bmFileHeader;
 file.Read((void*)&bmFileHeader,sizeof(bmFileHeader));
 if(bmFileHeader.bfType!=0x4d42)
 {
  AfxMessageBox("Not a bitmap file");
  m_pBmFileHeader=0;
  m_pBmInfo=0;
  m_pBmInfoHeader=0;
  m_pRGBTable=0;
  m_pDibBits=0;
  m_numColors=0;
 }
 else
 {
  DWORD fileLength=file.GetLength();
  DWORD dibSize=fileLength-sizeof(bmFileHeader);


  BYTE *pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,dibSize);
  pDib=new BYTE[dibSize];
  file.Read(pDib,dibSize);
  file.Close();


  m_pBmInfo=(LPBITMAPINFO)pDib;
  m_pBmInfoHeader=(LPBITMAPINFOHEADER)pDib;
  
  m_pBmInfoHeader->biSizeImage=GetDibSizeImage();

  m_pDibBits=pDib+m_pBmInfoHeader->biSize;
 
 }
}
DWORD CDib::GetDibSizeImage()
{
 if(m_pBmInfoHeader->biSizeImage==0)
 {
  DWORD byteWidth=(DWORD)GetDibWidth();
  DWORD height=(DWORD)GetDibHeight();
  DWORD imageSize=byteWidth*height;
  return imageSize;
 }
 else
  return m_pBmInfoHeader->biSizeImage;
}
UINT CDib::GetDibWidth()
{
 return (UINT)m_pBmInfoHeader->biWidth;

}
UINT CDib::GetDibHeight()
{
 return (UINT)m_pBmInfoHeader->biHeight;
}
LPBITMAPINFOHEADER CDib::GetDibInfoHeaderPtr()
{
 return m_pBmInfoHeader;
}
LPBITMAPINFO CDib::GetDIbInfoPtr()
{
 return m_pBmInfo;
}
BYTE* CDib::GetDibBitsPtr()
{
 return m_pDibBits;

}

原文地址:https://www.cnblogs.com/gaoteng/p/2350395.html