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

📄 imageobject.cpp

📁 数字图象处理程序.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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 CImageObject::ExtensionIndex( const char *pszFilename )
{
	int Index = 0;
	char *pszExtension;

	pszExtension = (char *) &pszFilename[strlen(pszFilename)-4];

	while( szExtensions[Index][0] ){
		if( !stricmp( pszExtension, szExtensions[Index] ) ) return( Index + 1 );
		Index++;
		}

	return( -1 );

}

////////////////////////////////////////////////////////////////////////
//int GetWidth( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素宽度数。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nWidth
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
int CImageObject::GetWidth( void )
{

	return( m_nWidth );

}

////////////////////////////////////////////////////////////////////////
//int GetHeight( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素高度数。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nHeight
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
int CImageObject::GetHeight( void )
{

	return( m_nHeight );

}

////////////////////////////////////////////////////////////////////////
//int GetNumBits( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素数:1、4、8、16、24、32。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nBits
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
int CImageObject::GetNumBits( void )
{

	return( m_nBits );

}

////////////////////////////////////////////////////////////////////////
//int GetNumColors( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像调色板中的颜色。图像为16位色或更高时返回值为0。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nColors
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
int CImageObject::GetNumColors( void )
{

	return( m_nColors );

}

////////////////////////////////////////////////////////////////////////
//BOOL GetPaletteData( RGBQUAD *pRGBPalette )		    
//----------------------------------------------------------------------
//基本功能:本函数将当前RGB调色板数据填入到所传入的指针中。如果图像是16
//			位色或更高时则不进行任何操作。
//----------------------------------------------------------------------
//参数说明:RGBQUAD *pRGBPalette
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
BOOL CImageObject::GetPaletteData( RGBQUAD *pRGBPalette )
{

	m_nLastError = IMAGELIB_HDIB_NULL;
	if( m_hDib == NULL ) return( FALSE );

	char *pTemp;
	pTemp = (char *) ::GlobalLock( m_hDib );
	m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
	if( pTemp == NULL ) return( FALSE );

	memcpy( pRGBPalette, &pTemp[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)], m_nPaletteBytes );

	m_nLastError = IMAGELIB_SUCCESS;
	::GlobalUnlock( m_hDib );

	return( TRUE );

}

////////////////////////////////////////////////////////////////////////
//RGBQUAD GetPaletteData( void )		    
//----------------------------------------------------------------------
//基本功能:本函数返回一个指向CImageObject调色板数据序列的指针。如果图像
//			是16位色或更高时则返回NULL。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:返回一个指向CImageObject调色板数据序列的指针
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
RGBQUAD *CImageObject::GetPaletteData( void )
{
	m_nLastError = IMAGELIB_HDIB_NULL;
	if( m_hDib == NULL ) return( NULL );

	m_nLastError = IMAGELIB_NO_PALETTE_FOR_HIGH_COLOR;
	if( m_nColors <= 0 || m_nColors > 256 ) return( NULL );

	RGBQUAD *pRGBPalette;
	pRGBPalette = new RGBQUAD [m_nColors];
	if( pRGBPalette == NULL ){
		m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
		return( NULL );
		}

	char *pTemp;
	pTemp = (char *) ::GlobalLock( m_hDib );
	m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
	if( pTemp == NULL ){
		delete [] pRGBPalette;
		return( NULL );
		}

	memcpy( pRGBPalette, &pTemp[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)], m_nColors * sizeof( RGBQUAD ) );

	m_nLastError = IMAGELIB_SUCCESS;
	::GlobalUnlock( m_hDib );

	return( pRGBPalette );

}

////////////////////////////////////////////////////////////////////////
//int GetImageType( const char *pFilename )		    
//----------------------------------------------------------------------
//基本功能:本函数返回图像的类型。图像类型定义如下:
//			#define IMAGETYPE_NONE		0
//			#define IMAGETYPE_BMP		1
//			#define IMAGETYPE_GIF		2
//			#define IMAGETYPE_PCX		3
//			#define IMAGETYPE_TGA		4
//			#define IMAGETYPE_JPG		5
//			#define IMAGETYPE_TIF		6
//----------------------------------------------------------------------
//参数说明:const char *pFilename
//----------------------------------------------------------------------
//返 回 值:int nImageType
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
int CImageObject::GetImageType( const char *pFilename )
{

	return( ::FileType( pFilename ) );

}

////////////////////////////////////////////////////////////////////////
//int GetImageType( void )		    
//----------------------------------------------------------------------
//基本功能:本函数返回图像的类型。图像类型定义如下:
//			#define IMAGETYPE_NONE		0
//			#define IMAGETYPE_BMP		1
//			#define IMAGETYPE_GIF		2
//			#define IMAGETYPE_PCX		3
//			#define IMAGETYPE_TGA		4
//			#define IMAGETYPE_JPG		5
//			#define IMAGETYPE_TIF		6
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nImageType
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
int CImageObject::GetImageType( void )
{

	return( m_nImageType );

}

////////////////////////////////////////////////////////////////////////
//BOOL Draw( CDC *pDC, int nX, int nY )		    
//----------------------------------------------------------------------
//基本功能:本函数是在设备描述表上绘制图像。如果X和Y坐标没有给出,图像会
//			被画在(0,0)坐标或上次传入的有效坐标处。
//----------------------------------------------------------------------
//参数说明:CDC *pDC
//			int nX,默认为-1
//			int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
//编	者:耿	楠
//最后编改:2001年11月20日
////////////////////////////////////////////////////////////////////////
BOOL CImageObject::Draw( CDC *pDC, int nX, int nY )
{
	if( nX != -1 ) m_nX = nX;
	if( nY != -1 ) m_nY = nY;

	m_nLastError = IMAGELIB_HDIB_NULL;
	if( m_hDib == NULL ) return( FALSE );

	char *pTemp;
	pTemp = (char *) ::GlobalLock( m_hDib );
	m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
	if( pTemp == NULL ) return( NULL );
	BITMAPINFOHEADER *pBIH;
	pBIH = (BITMAPINFOHEADER *) &pTemp[sizeof(BITMAPFILEHEADER)];

	int nRet = ::StretchDIBits( pDC->m_hDC, m_nX, m_nY, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, (const void FAR *) &pTemp[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+m_nPaletteBytes], (BITMAPINFO *) pBIH, DIB_RGB_COLORS, SRCCOPY );

	::GlobalUnlock( m_hDib );
	m_nLastError = IMAGELIB_STRETCHDIBITS_ERROR;
	if( nRet != m_nHeight ) return( FALSE );
	m_nLastError = IMAGELIB_SUCCESS;

	return( TRUE );

}

//创建调色板
LOGPALETTE *CImageObject::CreateLogPalette( RGBQUAD *pPalette, int nNumColors )
{
	LOGPALETTE *pLogPal;
	int i;

	if( pPalette == NULL ) return( NULL );

	pLogPal = (LOGPALETTE *) new char [sizeof(LOGPALETTE)+nNumColors*sizeof(PALETTEENTRY)];
	if( pLogPal == NULL ) return( NULL );

	pLogPal->palVersion = 0x300;
	pLogPal->palNumEntries = (unsigned short) nNumColors;
	for( i=0; i<nNumColors; i++ ){
		pLogPal->palPalEntry[i].peRed = pPalette[i].rgbRed;
		pLogPal->palPalEntry[i].peGreen = pPalette[i].rgbGreen;
		pLogPal->palPalEntry[i].peBlue = pPalette[i].rgbBlue;
		pLogPal->palPalEntry[i].peFlags = 0;
		}

	return( pLogPal );

}

//处理图像头
void CImageObject::ProcessImageHeader( void )
{

	m_nLastError = IMAGELIB_HDIB_NULL;
	if( m_hDib == NULL ) return;

	char *pTemp;
	BITMAPINFOHEADER *pBIH;
	pTemp = (char *) ::GlobalLock( m_hDib );
	m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
	if( pTemp == NULL ) return;

	pBIH = (BITMAPINFOHEADER *) &pTemp[sizeof(BITMAPFILEHEADER)];
	m_nWidth = pBIH->biWidth;
	m_nHeight = pBIH->biHeight;
	m_nPlanes = pBIH->biPlanes;
	m_nBits = pBIH->biBitCount;
	m_nColors = 1 << m_nBits;
	if( m_nPlanes > 1 ) m_nColors <<= ( m_nPlanes - 1 );
	if( m_nBits >= 16 ) m_nColors = 0;

	::GlobalUnlock( m_hDib );

	m_nLastError = IMAGELIB_SUCCESS;

}

//处理体调色板
void CImageObject::ProcessPalette( void )
{

	m_nLastError = IMAGELIB_HDIB_NULL;
	if( m_hDib == NULL ) return;

	CWindowDC WindowDC( NULL );
	m_nScreenPlanes = WindowDC.GetDeviceCaps( PLANES );
	m_nScreenBits = WindowDC.GetDeviceCaps( BITSPIXEL );

	m_nPaletteBytes = 0;
	m_Palette.DeleteObject();

	if( m_nBits <= 8 ) m_nPaletteBytes = m_nColors * sizeof( RGBQUAD );
	if( m_nScreenBits >= 16 ) return;

	char *pTemp;

⌨️ 快捷键说明

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