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

📄 imageobject.cpp

📁 数字图象处理程序.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// ImageObject.cpp

#include "stdafx.h"
#include "ImageObject.h"
#include "Errors.h"


IMPLEMENT_DYNCREATE(CImageObject, CObject)

char *CImageObject::szExtensions[] = { ".BMP", ".GIF", ".PCX", ".TGA", ".JPG", ".TIF", "" };
        
//Diagnostics and dump member functions, overridden
#ifdef _DEBUG
void CImageObject::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 CImageObject::AssertValid() const
{
	//call inherited AssertValid first
	CObject::AssertValid();
	//check CImageObject members...
	ASSERT(m_pszFilename != NULL); //must exist
	ASSERT(m_hDib != NULL); //must exist
}
#endif

////////////////////////////////////////////////////////////////////////
//CImageObject类的构造函数		    
//----------------------------------------------------------------------
//基本功能:这是一个无参数的构造函数。它简单地创建一个CImageObject对象并
//			初始化其内部变量。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:无
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
CImageObject::CImageObject()
{

	//调用辅助函数初始化其内部变量。
	InitVars();

}

////////////////////////////////////////////////////////////////////////
//CImageObject类的构造函数		    
//----------------------------------------------------------------------
//基本功能:用另一个CImageObject对象来创建一个CImageObject对象。
//----------------------------------------------------------------------
//参数说明:CImageObject *pImageObject
//----------------------------------------------------------------------
//返 回 值:无
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
CImageObject::CImageObject(CImageObject *pImageObject)
{
	InitVars();

	KillImage();
	
	m_nWidth = pImageObject->m_nWidth;
	m_nHeight = pImageObject->m_nHeight;
	m_nPlanes = pImageObject->m_nPlanes;
	m_nBits = pImageObject->m_nBits;
	m_nColors = pImageObject->m_nColors;
	m_nImageType = pImageObject->m_nImageType;
	m_nX = pImageObject->m_nX;
	m_nY = pImageObject->m_nY;
	m_nLastError = pImageObject->m_nLastError;
	m_nScreenPlanes = pImageObject->m_nScreenPlanes;
	m_nScreenBits = pImageObject->m_nScreenBits;
	m_nPaletteBytes = pImageObject->m_nPaletteBytes;
	m_nQuality = pImageObject->m_nQuality;
	m_nPaletteCreationType = pImageObject->m_nPaletteCreationType;
	
	int nNumColors = m_nColors;
	int nWidthBytes = WidthBytes( m_nBits, m_nWidth );
	
	if( pImageObject->m_hDib != NULL )
	{
		DWORD dwSize = ::GlobalSize( pImageObject->m_hDib );
		char *pData = (char *) ::GlobalLock( pImageObject->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( pImageObject->m_hDib );
		}
	}
}

////////////////////////////////////////////////////////////////////////
//CImageObject类的构造函数		    
//----------------------------------------------------------------------
//基本功能:构造一个CImageObject对象。唯一的要求的一个参数是文件名。如果
//			给出了CDC参数,图像只要一加载便被绘制。如果给出了nX或nY,这
//			两个值会被保存起来并且图像显示在该坐标所在的位置。否则,图像
//			总是显示在坐标为(0,0)的位置。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
//			CDC *pDC,默认为NULL
//			int nX,默认为-1
//			int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:无
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
CImageObject::CImageObject( const char *pszFilename,
						   CDC *pDC, int nX, int nY )
{

	InitVars();
	Load( pszFilename, pDC, nX, nY );

}

CImageObject::~CImageObject()
{

	if( m_hDib ) ::GlobalFree( m_hDib );
	if( m_pszFilename != NULL ) delete [] m_pszFilename;
	if( m_pLogPal != NULL ) delete [] m_pLogPal;

}

//初始化
void CImageObject::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()		    
//----------------------------------------------------------------------
//基本功能:本函数把一个文件装入CImageObject。必需的一个参数是文件名。如
//			果给出了CDC参数,图像只要一加载便被绘制。如果给出了nX或nY,
//			这两个值会被保存起来并且图像显示在该坐标所在的位置。否则,图
//			像总是显示在坐标为(0,0)的位置。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
//			CDC *pDC,默认为NULL
//			int nX,默认为-1
//			int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
BOOL CImageObject::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 );

	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( const char *pszFilename,int *pnWidth,int *pnHeight,
//	 int *pnPlanes, int *pnBitsPerPixel, int *pnNumColors )		    
//----------------------------------------------------------------------
//基本功能:本函数获取图像信息如图像宽度、高度、位平面数、每个像素点的位
//			数、以及颜色数。值为NULL的参数将不被传入。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
//			int *pnWidth,			默认为NULL
//			int *pnHeight,			默认为NULL
//			int *pnPlanes,			默认为NULL
//			int *pnBitsPerPixel,	默认为NULL
//			int *pnNumColors,		默认为NULL
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
BOOL CImageObject::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 );
		}

	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()		    
//----------------------------------------------------------------------
//基本功能:本函数返回所发生的最后一次CImageObject类错误。详细错误信息见
//			"Errors.h"头文件。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nErrorNumber
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
int CImageObject::GetLastError( void )
{

	return( m_nLastError );

}

////////////////////////////////////////////////////////////////////////
//BOOL Save( const char *pszFilename, int nType )		    
//----------------------------------------------------------------------
//基本功能:本函数保存驻留于CImageObject对象中的当前图像(图像类型定义见
//			GetImageType()函数。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
//			int nType,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
BOOL CImageObject::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 );

	switch( m_nImageType ){
		case IMAGETYPE_BMP:
			return( ::SaveBMP( pszFilename, m_hDib ) );
			break;
		case IMAGETYPE_GIF:
			return( ::SaveGIF( pszFilename, m_hDib ) );

⌨️ 快捷键说明

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