?? dib.cpp
字號:
// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Dib.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// C
//////////////////////////////////////////////////////////////////////
//構造與析構函數
CDib::CDib()
{
m_hDrawDib=NULL;
m_pDib=NULL;
}
CDib::~CDib()
{
Close();
}
//在設備環境上繪制圖象
void CDib::Draw(CDC *pDC,int nWidth, int nHeight)
{
if(m_pDib!=NULL)
{
ASSERT(IsValid());
DrawDibRealize(m_hDrawDib,pDC->GetSafeHdc(),TRUE);
//采用VFW組件繪圖
DrawDibDraw(m_hDrawDib,pDC->GetSafeHdc(),
0,
0,
nWidth,
nHeight,
(BITMAPINFOHEADER *)m_pDib,
(LPVOID) GetBits(),
0,
0,
((BITMAPINFOHEADER *)m_pDib)->biWidth,
((BITMAPINFOHEADER *)m_pDib)->biHeight,
DDF_BACKGROUNDPAL);
}
}
//獲得位圖的CSize結構
CSize CDib::GetSize()
{
return CSize(((BITMAPINFOHEADER *)m_pDib)->biWidth,
((BITMAPINFOHEADER *)m_pDib)->biHeight);
}
//獲得位圖的寬度
DWORD CDib::GetWidth()
{
return ((BITMAPINFOHEADER *)m_pDib)->biWidth;
}
//獲得位圖每行的字節數
DWORD CDib::GetWidthBytes()
{
BITMAPINFOHEADER *lpDib=(BITMAPINFOHEADER *)m_pDib;
WORD wBitCount=lpDib->biBitCount;
WORD wWidth=lpDib->biWidth;
//WidthBytes=(((biWidth*biBitCount)+31)&~31)>>3
DWORD bytes_per_line=(((wWidth*wBitCount)+31)&~31)>>3;
return bytes_per_line;
}
//獲得位圖的高度
DWORD CDib::GetHeight()
{
return ((BITMAPINFOHEADER *)m_pDib)->biHeight;
}
//釋放位圖資源
void CDib::Close()
{
if(m_hDrawDib!=NULL)
{
DrawDibClose(m_hDrawDib);
m_hDrawDib=NULL;
}
if(m_pDib!=NULL)
{
delete m_pDib;
m_pDib=NULL;
m_pDibBits=NULL;
}
}
//將位圖文件中的位圖讀入內存中
BOOL CDib::Open(const char * pzFileName)
{
CFile file;
int nBmpFileHeaderSize;
Close();
//初始化DrawDib函數組
if(!(m_hDrawDib=DrawDibOpen()))
goto exit;
//打開位圖文件并讀取位圖的BITMAPFILEHEADER數據
nBmpFileHeaderSize=sizeof(BITMAPFILEHEADER);
if(!file.Open(pzFileName,CFile::modeRead | CFile::typeBinary))
goto exit;
if(file.Read((void *)&bmpFileHeader,nBmpFileHeaderSize)!=(UINT)nBmpFileHeaderSize)
goto failure;
//判斷位圖文件的有效性
if(bmpFileHeader.bfType!=*((WORD *)"BM"))
goto failure;
//為位圖數據分配空間
m_pDib=(BYTE *)new char [bmpFileHeader.bfSize-nBmpFileHeaderSize];
if(!m_pDib)
goto failure;
//將位圖數據讀入到內存中
file.ReadHuge(m_pDib,bmpFileHeader.bfSize-nBmpFileHeaderSize);
if(((BITMAPINFOHEADER *)m_pDib)->biSizeImage==0)
{
BITMAPINFOHEADER *pDib=(BITMAPINFOHEADER *)m_pDib;
//scan lines must be DWord aligned, hence the strange bit stuff
pDib->biSizeImage=((((pDib->biWidth*pDib->biBitCount)+31)&~31)>>3)*pDib->biHeight;
}
m_pDibBits=GetBits();
file.Close();
return TRUE;
failure:
file.Close();
exit:
Close();
return FALSE;
}
//保存位圖
BOOL CDib::Save(const char * pzFileName)
{
CFile file;
int nBmpFileHeaderSize;
nBmpFileHeaderSize=sizeof(BITMAPFILEHEADER);
if(!file.Open(pzFileName,CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
goto exit;
//將文件頭信息寫入
file.Write(&bmpFileHeader,nBmpFileHeaderSize);
if(!m_pDib)
goto failure;
//將文件其它信息寫入
file.WriteHuge(m_pDib,bmpFileHeader.bfSize-nBmpFileHeaderSize);
file.Close();
return TRUE;
failure:
file.Close();
exit:
return FALSE;
}
//獲得位圖數據的指針
BYTE * CDib::GetBits()
{
DWORD dwNumColors,dwColorTableSize;
BITMAPINFOHEADER *lpDib=(BITMAPINFOHEADER *)m_pDib;
//獲取顏色數
WORD wBitCount=lpDib->biBitCount;
if(lpDib->biSize>=36)
dwNumColors=lpDib->biClrUsed;
else
dwNumColors=0;
if(dwNumColors==0)
{
if(wBitCount!=24)
dwNumColors=1L<<wBitCount;
else
dwNumColors=0;
}
dwColorTableSize=dwNumColors*sizeof(RGBQUAD);
return m_pDib+lpDib->biSize+dwColorTableSize;
}
DWORD CDib::GetBiBitCount()
{
if(m_pDib!=NULL)
return ((BITMAPINFOHEADER *)m_pDib)->biBitCount;
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -