⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dib.cpp

📁 本源码是用VC++6.0实现的
💻 CPP
字号:
// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "BmpCompress.h"
#include "Dib.h"
#include "windowsx.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDib::CDib():pDib(NULL)
{
	size=0;

	
}

CDib::~CDib()
{
	GlobalFreePtr(m_pBitmapInfo);
}

void CDib::LoadFile(const char  *dibFileName)
{
	strcpy(m_fileName,dibFileName);
	CFile dibFile(m_fileName,CFile::modeRead);
	strcpy(m_fileTitle,dibFile.GetFileName());	
	dibFile.Read((void *)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
	if(bitmapFileHeader.bfType == 0x4d42)
	{
		DWORD fileLength=dibFile.GetLength();
		size=fileLength-sizeof(BITMAPFILEHEADER);
	//	dibFile.Seek(sizeof(BITMAPFILEHEADER),CFile::begin);
		pDib=(BYTE *)GlobalAllocPtr(GMEM_MOVEABLE,size);
		TRY{
			dibFile.Read(pDib,size);//pDib是文件缓冲
		}
		CATCH (CFileException, e) {
			AfxMessageBox("Read error");
			GlobalFreePtr(pDib);  // free the DIB memory
			return ;
		}
		END_CATCH
		dibFile.Close();
		m_pBitmapInfo=(BITMAPINFO * )pDib;
		m_pBitmapInfoHeader=(BITMAPINFOHEADER * )pDib;
		m_pRGB=(RGBQUAD *)(pDib+m_pBitmapInfoHeader->biSize);
		int m_numberOfColors=GetNumberOfColors();
		if(m_pBitmapInfoHeader->biClrUsed==0)
			m_pBitmapInfoHeader->biClrUsed=m_numberOfColors;
		DWORD colorTableSize=m_numberOfColors * sizeof(RGBQUAD);
		m_pData=pDib + m_pBitmapInfoHeader->biSize +colorTableSize;
		if(m_pRGB==(RGBQUAD *)m_pData) //No color table
			m_pRGB=NULL;
		m_pBitmapInfoHeader->biSizeImage = GetSize();
		m_valid=TRUE;
		sizedata=fileLength-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)
			-colorTableSize;
	}
	else
	{
		m_valid = FALSE;
		AfxMessageBox("This isn't a bitmap file!");
	}
}

BOOL CDib::IsValid()
{
	return m_valid;
}

char *CDib::GetFileName()
{
	return m_fileName;
}

char *CDib::GetFileTle()
{
	return m_fileTitle;
}

UINT CDib::GetWidth()
{
	return (UINT)m_pBitmapInfoHeader->biWidth ;
}

UINT CDib::GetHeight()
{
	return (UINT)m_pBitmapInfoHeader->biHeight;
}

DWORD CDib::GetSize()
{
	if(m_pBitmapInfoHeader->biSizeImage!=0)
		return m_pBitmapInfoHeader->biSizeImage;
	else
	{
		DWORD height=(DWORD)GetHeight();
		DWORD width=WIDTHBYTES((DWORD)GetWidth());
		return height*width;
	}
}

UINT CDib::GetNumberOfColors()
{
	int numberOfColors;
	if((m_pBitmapInfoHeader->biClrUsed ==0) && 
		(m_pBitmapInfoHeader->biBitCount<9))
	{
		switch(m_pBitmapInfoHeader->biBitCount)
		{
		case 1: numberOfColors=2;break;
		case 4: numberOfColors=16;break;
		case 8: numberOfColors=256;
		}
	}
	else
		numberOfColors=(int)m_pBitmapInfoHeader->biClrUsed;
	return numberOfColors;
}

BYTE * CDib::GetData()
{
	return m_pData;
}

RGBQUAD *CDib::GetRGB()
{
	return m_pRGB;
}

BITMAPINFO *CDib::GetInfo()
{
	return m_pBitmapInfo;
}

WORD CDib::PaletteSize(LPBYTE lpDIB)
{
	return (DIBNumColors(lpDIB)*sizeof(RGBTRIPLE));
}

WORD CDib::DIBNumColors(LPBYTE lpDIB)
{
	WORD wBitCount;
	wBitCount=((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
	switch(wBitCount)
	{
	case 1:
		return 2;
	case 4:
		return 16;
	case 8:
		return 256;
	default:
		return 0;
	}
}

DWORD CDib::GetFileSize()
{
	return bitmapFileHeader.bfSize;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -