📄 dibobject.cpp
字号:
//DibObject.cpp
#include "stdafx.h"
#include "DibObject.h"
IMPLEMENT_DYNCREATE(CDibObject, CObject)
char *CDibObject::szExtensions[] = { ".BMP", ".GIF", ".PCX", ".TGA", ".JPG", ".TIF", "" };
//Diagnostics and dump member functions, overridden
#ifdef _DEBUG
void CDibObject::Dump(CDumpContext &dc) const
{
//call base class function first
CObject::Dump(dc);
//now do the stuff for our specific class
dc<<"File Name:"<<m_pszFilename<<"\n";
}
#endif
#ifdef _DEBUG
void CDibObject::AssertValid() const
{
//call inherited AssertValid first
CObject::AssertValid();
//check CDibObject members...
ASSERT(m_pszFilename != NULL); //must exist
ASSERT(m_hDib != NULL); //must exist
}
#endif
////////////////////////////////////////////////////////////////////////
//CDibObject类的构造函数
//----------------------------------------------------------------------
//基本功能:这是一个无参数的构造函数。它简单地创建一个CDibObject对象并
// 初始化其内部变量。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
CDibObject::CDibObject()
{
//调用辅助函数初始化其内部变量。
InitVars();
}
////////////////////////////////////////////////////////////////////////
//CDibObject类的构造函数
//----------------------------------------------------------------------
//基本功能:用一个CDibObject对象通过复制操作来创建一个CDibObject对象。
//----------------------------------------------------------------------
//参数说明:CDibObject *pDibObject
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
CDibObject::CDibObject(CDibObject *pDibObject)
{
InitVars();
KillImage();
m_nWidth = pDibObject->m_nWidth;
m_nHeight = pDibObject->m_nHeight;
m_nPlanes = pDibObject->m_nPlanes;
m_nBits = pDibObject->m_nBits;
m_nColors = pDibObject->m_nColors;
m_nImageType = pDibObject->m_nImageType;
m_nX = pDibObject->m_nX;
m_nY = pDibObject->m_nY;
m_nLastError = pDibObject->m_nLastError;
m_nScreenPlanes = pDibObject->m_nScreenPlanes;
m_nScreenBits = pDibObject->m_nScreenBits;
m_nPaletteBytes = pDibObject->m_nPaletteBytes;
m_nQuality = pDibObject->m_nQuality;
m_nPaletteCreationType = pDibObject->m_nPaletteCreationType;
int nNumColors = m_nColors;
int nWidthBytes = WidthBytes( m_nBits, m_nWidth );
if( pDibObject->m_hDib != NULL )
{
DWORD dwSize = ::GlobalSize( pDibObject->m_hDib );
char *pData = (char *) ::GlobalLock( pDibObject->m_hDib );
if( pData != NULL )
{
HGLOBAL hGlobal = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );
if( hGlobal != NULL ){
char *pDestData = (char *) ::GlobalLock( hGlobal );
if( pDestData != NULL )
{
memcpy( pDestData, pData, dwSize );
::GlobalUnlock( hGlobal );
m_hDib = hGlobal;
}
else ::GlobalFree( hGlobal );
}
::GlobalUnlock( pDibObject->m_hDib );
}
}
}
////////////////////////////////////////////////////////////////////////
//CDibObject类的构造函数
//----------------------------------------------------------------------
//基本功能:构造一个CDibObject对象。唯一的要求的一个参数是文件名。如果
// 给出了CDC设备上下文参数,图像加载后会立即在该设备上下文中显示
// 出来。如果给出了nX或nY参数,图像会显示在该坐标指定的位置,否
// 则,图像总是显示在坐标为(0, 0)的位置。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
// CDC *pDC,默认为NULL
// int nX,默认为-1
// int nY,默认为-1
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
CDibObject::CDibObject( const char *pszFilename,
CDC *pDC, int nX, int nY )
{
InitVars();
Load( pszFilename, pDC, nX, nY );
}
////////////////////////////////////////////////////////////////////////
//CDibObject类的析构函数
//----------------------------------------------------------------------
//基本功能:析构CDibObject对象,删除该对象中的图像及相应的变量
//----------------------------------------------------------------------
//参数说明:无
////////////////////////////////////////////////////////////////////////
CDibObject::~CDibObject()
{
if( m_hDib ) ::GlobalFree( m_hDib );
if( m_pszFilename != NULL ) delete [] m_pszFilename;
if( m_pLogPal != NULL ) delete [] m_pLogPal;
}
////////////////////////////////////////////////////////////////////////
//InitVars()函数
//----------------------------------------------------------------------
//基本功能:初始化CDibObject类内部变量
//----------------------------------------------------------------------
//参数说明:BOOL bFlag 标记类中是否有图像打开,默认值为FALSE
////////////////////////////////////////////////////////////////////////
void CDibObject::InitVars( BOOL bFlag )
{
m_nWidth = m_nHeight = m_nBits = m_nColors = m_nImageType = 0;
m_nX = m_nY = 0;
m_nLastError = 0;
m_hDib = NULL;
m_nPaletteCreationType = FIXED_PALETTE;
if( !bFlag )
{
m_pszFilename = NULL;
m_pLogPal = NULL;
}
m_nQuality = 50;
}
////////////////////////////////////////////////////////////////////////
//BOOL Load()
//----------------------------------------------------------------------
//基本功能:本函数把一个图像文件载入CDibObject类。必需的一个参数是文件
// 名。如果给出了CDC设备上下文参数,图像一加载就被绘制。如果给
// 出了nX或nY参数,图像将显示在该坐标指定的位置。否则,图像总是
// 显示在坐标为(0,0)的位置。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
// CDC *pDC,默认为NULL
// int nX,默认为-1
// int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::Load( const char *pszFilename,
CDC *pDC, int nX, int nY )
{
//获取图像文件类型
m_nImageType = FileType( pszFilename );
if( m_nImageType == 0 )
{
m_nLastError = IMAGELIB_UNSUPPORTED_FILETYPE;
return( FALSE );
}
//删除已存在的图像
KillImage();
m_pszFilename = new char [strlen(pszFilename)+1];
if( m_pszFilename != NULL ) strcpy( m_pszFilename, pszFilename );
//根据文件类型调用ImageLoad.dll动态链接库中的相应函数打开图像文件
switch( m_nImageType )
{
case IMAGETYPE_BMP:
m_hDib = ::LoadBMP( pszFilename );
if( m_hDib == NULL ){
m_nLastError = ::GetLastPicLibError();
return( FALSE );
}
break;
case IMAGETYPE_GIF:
m_hDib = ::LoadGIF( pszFilename );
if( m_hDib == NULL ){
m_nLastError = ::GetLastPicLibError();
return( FALSE );
}
break;
case IMAGETYPE_JPG:
m_hDib = ::LoadJPG( pszFilename );
if( m_hDib == NULL ){
m_nLastError = ::GetLastPicLibError();
return( FALSE );
}
break;
case IMAGETYPE_PCX:
m_hDib = ::LoadPCX( pszFilename );
if( m_hDib == NULL ){
m_nLastError = ::GetLastPicLibError();
return( FALSE );
}
break;
case IMAGETYPE_TGA:
m_hDib = ::LoadTGA( pszFilename );
if( m_hDib == NULL ){
m_nLastError = ::GetLastPicLibError();
return( FALSE );
}
break;
case IMAGETYPE_TIF:
m_hDib = ::LoadTIF( pszFilename );
if( m_hDib == NULL ){
m_nLastError = ::GetLastPicLibError();
return( FALSE );
}
break;
}
//处理图像信息头
ProcessImageHeader();
//处理调色板
ProcessPalette();
//若传入了设备上下文指针,就在指定的设备上下文中绘制图像
if( pDC != NULL ) Draw( pDC, nX, nY );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL GetImageInfo()
//----------------------------------------------------------------------
//基本功能:本函数获取图像宽度、高度、位平面数、每个像素点的位数、以及颜
// 色数的信息。值为NULL的参数将不被传入。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
// int *pnWidth, 默认为NULL
// int *pnHeight, 默认为NULL
// int *pnPlanes, 默认为NULL
// int *pnBitsPerPixel, 默认为NULL
// int *pnNumColors, 默认为NULL
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::GetImageInfo( const char *pszFilename, int *pnWidth,
int *pnHeight, int *pnPlanes, int *pnBitsPerPixel, int *pnNumColors )
{
int nImageType;
//获取图像文件类型
nImageType = FileType( pszFilename );
if( nImageType == 0 )
{
m_nLastError = IMAGELIB_UNSUPPORTED_FILETYPE;
return( FALSE );
}
//根据文件类型调用ImageLoad.dll动态链接库中的相应函数获取图像信息
switch( nImageType )
{
case IMAGETYPE_BMP:
return( ::GetBMPInfo( pszFilename, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) );
case IMAGETYPE_GIF:
return( ::GetGIFInfo( pszFilename, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) );
case IMAGETYPE_JPG:
return( ::GetJPGInfo( pszFilename, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) );
case IMAGETYPE_PCX:
return( ::GetPCXInfo( pszFilename, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) );
case IMAGETYPE_TGA:
return( ::GetTGAInfo( pszFilename, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) );
case IMAGETYPE_TIF:
return( ::GetTIFInfo( pszFilename, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) );
}
return( FALSE );
}
////////////////////////////////////////////////////////////////////////
//int GetLastError()
//----------------------------------------------------------------------
//基本功能:本函数返回所发生的最后一次CDibObject类错误。详细错误信息见
// "ImageErrors.h"头文件。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nErrorNumber
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::GetLastError( void )
{
return( m_nLastError );
}
////////////////////////////////////////////////////////////////////////
//BOOL Save()
//----------------------------------------------------------------------
//基本功能:本函数保存驻留于CDibObject对象中的当前图像(图像类型定义见
// GetImageType()函数。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
// int nType,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::Save( const char *pszFilename, int nType )
{
//若没有指定文件类型,则根据文件名判断其文件类型
if( nType == -1 ) nType = ExtensionIndex( pszFilename );
if( nType < IMAGETYPE_FIRSTTYPE || nType > IMAGETYPE_LASTTYPE ) return( FALSE );
m_nImageType = nType;
delete [] m_pszFilename;
m_pszFilename = new char [strlen(pszFilename)+1];
if( m_pszFilename != NULL ) strcpy( m_pszFilename, pszFilename );
//根据文件类型调用ImageLoad.dll动态链接库中的相应函数保存图像
switch( m_nImageType )
{
case IMAGETYPE_BMP:
return( ::SaveBMP( pszFilename, m_hDib ) );
break;
case IMAGETYPE_GIF:
return( ::SaveGIF( pszFilename, m_hDib ) );
break;
case IMAGETYPE_JPG:
return( ::SaveJPG( pszFilename, m_hDib, m_nQuality ) );
break;
case IMAGETYPE_PCX:
return( ::SavePCX( pszFilename, m_hDib ) );
break;
case IMAGETYPE_TGA:
return( ::SaveTGA( pszFilename, m_hDib ) );
break;
case IMAGETYPE_TIF:
return( ::SaveTIF( pszFilename, m_hDib ) );
break;
}
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//int ExtensionIndex()
//----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -