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

📄 dibobject.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//基本功能:本函数返回文件名指定的图像类型。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nWidth
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::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()
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素宽度数。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nWidth
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::GetWidth( void )
{

	return( m_nWidth );

}

////////////////////////////////////////////////////////////////////////
//int GetHeight( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素高度数。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nHeight
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::GetHeight( void )
{

	return( m_nHeight );

}

////////////////////////////////////////////////////////////////////////
//int GetNumBits( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素数:1、4、8、16、24、32。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nBits
////////////////////////////////////////////////////////////////////////
int CDibObject::GetNumBits( void )
{

	return( m_nBits );

}

////////////////////////////////////////////////////////////////////////
//int GetNumColors( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像调色板中的颜色。图像为16位色或更高时返回值为0。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nColors
////////////////////////////////////////////////////////////////////////
int CDibObject::GetNumColors( void )
{

	return( m_nColors );

}

////////////////////////////////////////////////////////////////////////
//BOOL GetPaletteData()		    
//----------------------------------------------------------------------
//基本功能:本函数将当前RGB调色板数据填入到所传入的指针中。如果图像是16
//			位色或更高时则不进行任何操作。
//----------------------------------------------------------------------
//参数说明:RGBQUAD *pRGBPalette
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::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()		    
//----------------------------------------------------------------------
//基本功能:本函数返回一个指向CDibObject调色板数据序列的指针。如果图像
//			是16位色或更高时则返回NULL。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:返回一个指向CDibObject调色板数据序列的指针
////////////////////////////////////////////////////////////////////////
RGBQUAD *CDibObject::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()		    
//----------------------------------------------------------------------
//基本功能:本函数返回图像的类型。图像类型定义如下:
//			#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
////////////////////////////////////////////////////////////////////////
int CDibObject::GetImageType( const char *pFilename )
{

	return( ::FileType( pFilename ) );

}

////////////////////////////////////////////////////////////////////////
//int GetImageType()		    
//----------------------------------------------------------------------
//基本功能:本函数返回图像的类型。图像类型定义如下:
//			#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
////////////////////////////////////////////////////////////////////////
int CDibObject::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
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::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 );

}

////////////////////////////////////////////////////////////////////////
//BOOL CreateLogPalette()		    
//----------------------------------------------------------------------
//基本功能:本函数根据指定的调色板指针及颜色数创建一个逻辑调色板。
//----------------------------------------------------------------------
//参数说明:CDC *pDC
//			int nX,默认为-1
//			int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:创建的逻辑调色板指针
////////////////////////////////////////////////////////////////////////
LOGPALETTE *CDibObject::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 ProcessImageHeader()		    
//----------------------------------------------------------------------
//基本功能:本函数处理图像信息头各项内容。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::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;

		
	int nWidthBytes = WidthBytes(m_nBits, m_nWidth);
	pBIH->biSizeImage = nWidthBytes * m_nHeight;

	::GlobalUnlock( m_hDib );

	m_nLastError = IMAGELIB_SUCCESS;

}

////////////////////////////////////////////////////////////////////////
//void ProcessPalette()		    
//----------------------------------------------------------------------
//基本功能:处理体调色板。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::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;
	pTemp = (char *) ::GlobalLock( m_hDib );
	m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
	if( pTemp == NULL ) return;

	if( m_nBits <= 8 ){
		RGBQUAD *pRGBPalette;
		pRGBPalette = (RGBQUAD *) &pTemp[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
		LOGPALETTE *pPalette;
		pPalette = CreateLogPalette( pRGBPalette, m_nColors );
		if( pPalette == NULL ){
			m_nLastError = IMAGELIB_LOGICAL_PALETTE_CREATION_ERROR;
			goto ProcessPaletteExit;
			}
		m_Palette.CreatePalette( pPalette );
		delete [] pPalette;

⌨️ 快捷键说明

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