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

📄 dibobject.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}

	m_nLastError = IMAGELIB_SUCCESS;

ProcessPaletteExit:
	::GlobalUnlock( m_hDib );

}

////////////////////////////////////////////////////////////////////////
//void KillImage()		    
//----------------------------------------------------------------------
//基本功能:清除当前CDibObject类中的图像对象。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::KillImage( void )
{

	if( m_hDib ) ::GlobalFree( m_hDib );
	m_hDib = NULL;

	if( m_pLogPal != NULL ) delete [] m_pLogPal;
	m_pLogPal = NULL;

	if( m_pszFilename != NULL ) delete [] m_pszFilename;
	m_pszFilename = NULL;

	m_Palette.DeleteObject();

}

////////////////////////////////////////////////////////////////////////
//BOOL SetPalette( CDC *pDC )		    
//----------------------------------------------------------------------
//基本功能:本函数将该设备描述表的调色板分配给相应的图像。当一个图像被载
//			入时,它的调色板信息便被存入CDibObject对象中。
//----------------------------------------------------------------------
//参数说明:CDC *pDC
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::SetPalette( CDC *pDC )
{

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

	pDC->SelectPalette( &m_Palette, FALSE );
	pDC->RealizePalette();

	m_nLastError = IMAGELIB_SUCCESS;

	return( TRUE );

}

////////////////////////////////////////////////////////////////////////
//BOOL IsLoaded( void )		    
//----------------------------------------------------------------------
//基本功能:本函数判断是否已经载入了一幅图像
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::IsLoaded( void )
{

	return( m_hDib != NULL );

}

////////////////////////////////////////////////////////////////////////
//void GetDIBPointer()		    
//----------------------------------------------------------------------
//基本功能:得到图像DIB数据指针。
//----------------------------------------------------------------------
//参数说明:int *nWidthBytes	图像的字节宽度
//			int nNewBits		新设置的图像颜色位数
//			int *nNewWidthBytes	图像颜色位数改变后的字节宽度
//			int nNewWidth		新设置的图像宽度(像素)
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void *CDibObject::GetDIBPointer( int *nWidthBytes,
								 int nNewBits, 
								 int *nNewWidthBytes,
								 int nNewWidth )
{

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

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

	if( nWidthBytes != NULL ) *nWidthBytes = WidthBytes( m_nBits, m_nWidth );

	if( nNewWidthBytes != NULL )
	{
		if( nNewWidth == -1 ) nNewWidth = m_nWidth;
		*nNewWidthBytes = WidthBytes( nNewBits, nNewWidth );
	}

	return( pTemp );

}

////////////////////////////////////////////////////////////////////////
//int WidthBytes()		    
//----------------------------------------------------------------------
//基本功能:本函数根据传入的像素位数及图像宽度(像素)计算其字节宽度。
//----------------------------------------------------------------------
//参数说明:int nBits	每像素位数
//			int nWidth	图像的宽度
//----------------------------------------------------------------------
//返 回 值:int	图像的字节宽度
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::WidthBytes( int nBits, int nWidth )
{
	int nWidthBytes;

	nWidthBytes = nWidth;
	if( nBits == 1 ) nWidthBytes = ( nWidth + 7 ) / 8;
	else if( nBits == 4 ) nWidthBytes = ( nWidth + 1 ) / 2;
	else if( nBits == 16 ) nWidthBytes = nWidth * 2;
	else if( nBits == 24 ) nWidthBytes = nWidth * 3;
	else if( nBits == 32 ) nWidthBytes = nWidth * 4;

	//一个数的后两位为零,则该数为4的整数倍
	while( ( nWidthBytes & 3 ) != 0 ) nWidthBytes++;

	return( nWidthBytes );

}


////////////////////////////////////////////////////////////////////////
//void NormalizeCoordinates()		    
//----------------------------------------------------------------------
//基本功能:规格化处理的图像区域。
//----------------------------------------------------------------------
//参数说明:int *nX1				处理区域左上角X坐标
//			int *nY1				处理区域左上角Y坐标
//			int *nX2				处理区域右下角X坐标
//			int *nY2				处理区域右下角Y坐标
//			BOOL *bCompleteImage	处理区域是否为全部区域
//			BOOL *bLessThanHalf		处理区域是否为一半区域
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::NormalizeCoordinates( int *nX1, int *nY1, int *nX2, int *nY2, 
									  BOOL *bCompleteImage, BOOL *bLessThanHalf )
{

	if( *nX1 == -1 ) *nX1 = 0;
	if( *nY1 == -1 ) *nY1 = 0;
	if( *nX2 == -1 ) *nX2 = m_nWidth - 1;
	if( *nY2 == -1 ) *nY2 = m_nHeight - 1;

	if( *nX1 > *nX2 ){
		int nTemp;
		nTemp = *nX1;
		*nX1 = *nX2;
		*nX2 = nTemp;		
		}

	if( *nY1 > *nY2 ){
		int nTemp;
		nTemp = *nY1;
		*nY1 = *nY2;
		*nY2 = nTemp;		
		}

	if( *nX1 < 0 ) *nX1 = 0;
	if( *nX2 > m_nWidth - 1 ) *nX2 = m_nWidth - 1;

	if( *nX2 < 0 ) *nX2 = 0;
	if( *nX2 > m_nWidth - 1 ) *nX2 = m_nWidth - 1;

	if( *nY1 < 0 ) *nY1 = 0;
	if( *nY1 > m_nHeight - 1 ) *nY1 = m_nHeight - 1;

	if( *nY2 < 0 ) *nY2 = 0;
	if( *nY2 > m_nHeight - 1 ) *nY2 = m_nHeight - 1;

	if( bCompleteImage != NULL ) *bCompleteImage = TRUE;
	if( bLessThanHalf != NULL ) *bLessThanHalf = FALSE;
	if( *nX1 > 0 || *nY1 > 0 || *nX2 < m_nWidth - 1 || *nY2 < m_nHeight - 1 ){
		if( bCompleteImage != NULL ) *bCompleteImage = FALSE;
		DWORD dwTotalPixels, dwThesePixels;
		dwTotalPixels = (DWORD) m_nWidth * m_nHeight;
		dwThesePixels = (DWORD) ( (*nX2) - (*nX1) + 1 ) * (DWORD) ( (*nY2) - (*nY1) + 1 );
		if( bLessThanHalf != NULL && dwThesePixels <= dwTotalPixels / 2 ) *bLessThanHalf = TRUE;
		}

}

////////////////////////////////////////////////////////////////////////
//void operator=()		    
//----------------------------------------------------------------------
//基本功能:“=”操作符重载。
//----------------------------------------------------------------------
//参数说明:CDibObject &DibObject	另一个CDibObject图像对象。
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::operator= (const CDibObject &DibObject)
{

	KillImage();

	m_nWidth = DibObject.m_nWidth;
	m_nHeight = DibObject.m_nHeight;
	m_nPlanes = DibObject.m_nPlanes;
	m_nBits = DibObject.m_nBits;
	m_nColors = DibObject.m_nColors;
	m_nImageType = DibObject.m_nImageType;
	m_nX = DibObject.m_nX;
	m_nY = DibObject.m_nY;
	m_nLastError = DibObject.m_nLastError;
	m_nScreenPlanes = DibObject.m_nScreenPlanes;
	m_nScreenBits = DibObject.m_nScreenBits;
	m_nPaletteBytes = DibObject.m_nPaletteBytes;
	m_nQuality = DibObject.m_nQuality;
	m_nPaletteCreationType = DibObject.m_nPaletteCreationType;

	int nNumColors = m_nColors;
	int nWidthBytes = WidthBytes( m_nBits, m_nWidth );

	if( DibObject.m_hDib != NULL ){

		DWORD dwSize = ::GlobalSize( DibObject.m_hDib );

		char *pData = (char *) ::GlobalLock( DibObject.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 );

					if( nNumColors != 0 ) CreatePaletteFromDIB( (RGBQUAD *) &pData[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)], nNumColors );

					else if( DibObject.m_pLogPal != NULL ){
						m_pLogPal = (LOGPALETTE *) new char [sizeof(LOGPALETTE)+DibObject.m_pLogPal->palNumEntries*sizeof(PALETTEENTRY)];
						if( m_pLogPal != NULL ){
							for( int i=0; i<DibObject.m_pLogPal->palNumEntries; i++ ) m_pLogPal[i] = DibObject.m_pLogPal[i];
							m_Palette.CreatePalette( m_pLogPal );
							}
						}

					::GlobalUnlock( hGlobal );
					m_hDib = hGlobal;
					}
				else ::GlobalFree( hGlobal );
				}
			::GlobalUnlock( DibObject.m_hDib );
			}
		}

	if( DibObject.m_pszFilename != NULL ){
		m_pszFilename = new char [strlen(DibObject.m_pszFilename)+1];
		strcpy( m_pszFilename, DibObject.m_pszFilename );
		}
}

////////////////////////////////////////////////////////////////////////
//void CreatePaletteFromDIB()		    
//----------------------------------------------------------------------
//基本功能:从当前CDibObject位图对象中创建调色板。
//----------------------------------------------------------------------
//参数说明:RGBQUAD *pRGBPalette	调色板指针
//			int nNumColors			图像颜色数
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::CreatePaletteFromDIB( RGBQUAD *pRGBPalette, int nNumColors )
{

	if( pRGBPalette != NULL ){
		LOGPALETTE *pPalette;
		pPalette = CreateLogPalette( pRGBPalette, nNumColors );
		if( pPalette != NULL ){
			m_Palette.CreatePalette( pPalette );
			delete [] pPalette;
			}
		else m_nLastError = IMAGELIB_LOGICAL_PALETTE_CREATION_ERROR;
		}

}

////////////////////////////////////////////////////////////////////////
//int GetNearestIndex()		    
//----------------------------------------------------------------------
//基本功能:获取相近颜色索引值。
//----------------------------------------------------------------------
//参数说明:unsigned char ucRed		红色分量
//			unsigned char ucGreen	绿色分量
//			unsigned char ucBlue	蓝色分量
//			RGBQUAD *pRGBPalette	调色板指针
//			int nNumColors			颜色数
//----------------------------------------------------------------------
//返 回 值:int	相近颜色索引值
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::GetNearestIndex( unsigned char ucRed,
								 unsigned char ucGreen, 
								 unsigned char ucBlue, 
								 RGBQUAD *pRGBPalette, 
								 int nNumColors )
{
	int i, Index = 0;
	DWORD NewDiff, Diff = 100000L;
	DWORD Red, Green, Blue;
	
	for( i=0; i<nNumColors; i++ )
	{
		if( ucRed > pRGBPalette[i].rgbRed ) Red = (DWORD) ( pRGBPalette[i].rgbRed - ucRed );
		else Red = (DWORD) ( ucRed - pRGBPalette[i].rgbRed );
		if( ucGreen > pRGBPalette[i].rgbGreen ) Green = (DWORD) ( pRGBPalette[i].rgbGreen - ucGreen );
		else Green = (DWORD) ( ucGreen - pRGBPalette[i].rgbGreen );
		if( ucBlue > pRGBPalette[i].rgbBlue ) Blue = (DWORD) ( pRGBPalette[i].rgbBlue - ucBlue );
		else Blue = (DWORD) ( ucBlue - pRGBPalette[i].rgbBlue );
		NewDiff = ( Red * Red ) + ( Green * Green ) + ( Blue * Blue );
		if( NewDiff < Diff )
		{
			if( NewDiff <= 1 ) return( i );
			Diff = NewDiff;
			Index = i;
		}
	}
	
	return( Index );

}

////////////////////////////////////////////////////////////////////////
//BOOL ChangeFormat( int nNewBitsPerPixel )		    
//----------------------------------------------------------------------
//基本功能:本函数将图像从当前分辨率转化为指定分辨率。
//----------------------------------------------------------------------
//参数说明:int nNewBitsPerPixel
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::ChangeFormat( int nNewBitsPerPixel )
{

	m_nLastError = IMAGELIB_SUCCESS;
	if( nNewBitsPerPixel == m_nBits ) return( TRUE );

	int nOldWidthBytes, nNewWidthBytes;
	char *pBuffer = (char *) GetDIBPointer( &nOldWidthBytes, nNewBitsPerPixel, &nNewWidthBytes );
	if( pBuffer == NULL ) return( FALSE );

	BITMAPINFOHEADER *pOldBIH, *pNewBIH;
	BITMAPFILEHEADER *pOldBFH, *pNewBFH;
	RGBQUAD *pOldRGBPalette, *pNewRGBPalette;
	unsigned char *pOldBits, *pNewBits;
	int nNumColors, nNumNewColors;

	pOldBFH = (BITMAPFILEHEADER *) pBuffer;
	pOldBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
	pOldRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
	nNumColors = m_nColors;
	nNumNewColors = 1 << nNewBitsPerPixel;
	if( nNewBitsPerPixel > 8 ) nNumNewColors = 0;
	pOldBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];

	if( m_nBits >= 16 && nNewBitsPerPixel < 16 ){

⌨️ 快捷键说明

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