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

📄 imageobject.cpp

📁 分水岭算法
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// ImageObject.cpp: implementation of the CImageObject class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ImageObject.h"
#include "ImageLoad.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

IMPLEMENT_DYNCREATE( CImageObject, CObject ) 

char *CImageObject::pszExtensions[] = { ".bmp", ".gif", ".pcx", ".tga", ".jpg", ".tif", "" };

//////////////////////////////////////////////////
// Constructor and destructor
//
CImageObject::CImageObject()
{
	m_nWidth = m_nHeight = m_nBits = m_nColors = m_nImageType = 0;
	m_nX = m_nY = 0;
	m_nLastError = 0;
	m_hDib = NULL;
	m_nPaletteCreationType = JGPT_FIXED_PALETTE;
    m_pszFileName = NULL;
    m_pLogPalette = NULL;
	m_nQuality = 80;
	m_pDib = NULL;
	m_lBufSize = 0;
}

CImageObject::CImageObject( const char *pszFileName, CDC *pDC, int nX, int nY )
{
	m_nWidth = m_nHeight = m_nBits = m_nColors = m_nImageType = 0;
	m_nX = m_nY = 0;
	m_nLastError = 0;
	m_hDib = NULL;
	m_nPaletteCreationType = JGPT_FIXED_PALETTE;
	m_pszFileName = NULL;
	m_pLogPalette = NULL;
	m_nQuality = 80;
	m_pDib = NULL;
	m_lBufSize = 0;
	LoadFromFile( pszFileName, pDC, nX, nY );
}

void CImageObject::operator=( const CImageObject &ImageObject )
{
	DestroyImage();

	m_nLastError = ImageObject.m_nLastError;

    m_nWidth = ImageObject.m_nWidth;
	m_nHeight = ImageObject.m_nHeight;
	m_nPlanes = ImageObject.m_nPlanes;
	m_nBits = ImageObject.m_nBits;
	m_nColors = ImageObject.m_nColors;
	m_nImageType = ImageObject.m_nImageType;
	
	m_nX = ImageObject.m_nX;
	m_nY = ImageObject.m_nY;

	m_nScreenPlanes = ImageObject.m_nScreenPlanes;
	m_nScreenBits = ImageObject.m_nScreenBits;
	m_nPaletteInBytes = ImageObject.m_nPaletteInBytes;
	m_nQuality = ImageObject.m_nQuality;
	m_nPaletteCreationType = ImageObject.m_nPaletteCreationType;
	
	int nNumColors = m_nColors;
	int nWidthBytes = GetWidthInBytes( m_nBits, m_nWidth );
	
	if( ImageObject.m_hDib != NULL )
	{
		DWORD dwSize = ::GlobalSize( ImageObject.m_hDib );
		char *pData = ( char * )::GlobalLock( ImageObject.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( ImageObject.m_pLogPalette != NULL )
					{
						m_pLogPalette = (LOGPALETTE *) new char[ sizeof( LOGPALETTE ) + ImageObject.m_pLogPalette->palNumEntries * sizeof( PALETTEENTRY ) ];
						if( m_pLogPalette != NULL )
						{
							for( int i=0; i<ImageObject.m_pLogPalette->palNumEntries; i++ )
								m_pLogPalette[i] = ImageObject.m_pLogPalette[i];
							m_Palette.CreatePalette( m_pLogPalette );
						}
					}
					::GlobalUnlock( hGlobal );
					m_hDib = hGlobal;
				}
				else ::GlobalFree( hGlobal );
			}
			::GlobalUnlock( ImageObject.m_hDib );
		}
	}
	if( ImageObject.m_pszFileName != NULL )
	{
		m_pszFileName = new char [strlen( ImageObject.m_pszFileName ) + 1 ];
		strcpy( m_pszFileName, ImageObject.m_pszFileName );
	}
}

CImageObject::~CImageObject()
{
	if(m_pDib)
		::GlobalUnlock(m_hDib);
	if(m_hDib)
		::GlobalFree( m_hDib );
	if(m_pszFileName != NULL )
	{
		delete[] m_pszFileName;
		m_pszFileName = NULL;
	}
}

//////////////////////////////////////////
// Get/set member functions
//
int CImageObject::GetExtensionIndex( const char *pszFileName )
{
	int Index = 0;
	char *pszExt;
	pszExt = ( char * )&pszFileName[ strlen( pszFileName ) - 4 ];
	while( pszExtensions[ Index ][ 0 ] )
	{
		if( !stricmp( pszExt, pszExtensions[ Index ] ) ) 
			return( Index + 1 );
		Index++;
	}
	return( -1 );
}

int CImageObject::GetLastError( void )
{
	return( m_nLastError );
}

bool CImageObject::IsLoaded( void )
{
	return( m_hDib != NULL );
}

int CImageObject::GetWidth( void )
{
	return( m_nWidth );
}

int CImageObject::GetHeight( void )
{
	return( m_nHeight );
}

int CImageObject::GetBits( void )
{
	return( m_nBits );
}

int CImageObject::GetColors( void )
{
	return( m_nColors );
}

HGLOBAL CImageObject::GetDib( void )
{
	return( m_hDib );
}

void CImageObject::SetDib( HGLOBAL hDib )
{
	m_hDib = hDib;
}


long CImageObject::GetSize()
{
   return (long) sizeof(BITMAPFILEHEADER)
        +sizeof(BITMAPINFOHEADER)
		+m_nColors*sizeof(RGBQUAD)
		+GetWidthInBytes(m_nBits,m_nWidth)*m_nHeight;
}

int CImageObject::GetDestX()
{
	return m_nX;
}

int CImageObject::GetDestY()
{
	return m_nY;
}

BYTE * CImageObject::GetDibPoint(void)
{
	return(m_pDib);
}
// Palette
int CImageObject::GetPaletteInBytes( void )
{
	return( m_nPaletteInBytes );
}

CPalette *CImageObject::GetPalette( void )
{
	return( &m_Palette );
}

LOGPALETTE *CImageObject::GetLogPalette( void )
{
	return( m_pLogPalette );
}

void CImageObject::SetLogPalette( LOGPALETTE *pLogPalette )
{
	m_pLogPalette = pLogPalette;
}

void CImageObject::SetPaletteCreationType( int nType )
{
	m_nPaletteCreationType = nType;
}

int CImageObject::GetPaletteCreationType( void )
{
	return( m_nPaletteCreationType );
}

void CImageObject::SetQuality( int nQuality )
{
	m_nQuality = nQuality;
}

/*
int CImageObject::GetImageType( const char *pszFileName )
{
	return( ::FileType( pszFileName ) );
}
*/
char *CImageObject::GetImageName()
{
  return( m_pszFileName );
}

int CImageObject::GetImageType( void )
{
	return( m_nImageType );
}

//////////////////////////////////////////
// Get/set member functions
//
/*
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 = GL_UNSUPPORTED_FILETYPE;
		return( false );
	}
	switch( nImageType )
	{
		case GT_BMP:
			if( ::GetBMPInfo( pszFileName, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) )
				return( true );
		  break;
		case GT_GIF:
			if( ::GetGIFInfo( pszFileName, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) )
				return( true );
		  break;
		case GT_JPG:
			if( ::GetJPGInfo( pszFileName, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) )
				return( true );
		  break;
		case GT_PCX:
			if( ::GetPCXInfo( pszFileName, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) )
				return( true );
		  break;
		case GT_TGA:
			if( ::GetTGAInfo( pszFileName, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) )
				return( true );
		  break;
		case GT_TIF:
			if( ::GetTIFInfo( pszFileName, pnWidth, pnHeight, pnPlanes, pnBitsPerPixel, pnNumColors ) )
				return( true );
		  break;
	}
	return( false );
}
*/
bool CImageObject::GetImageInfo( ImageINFO *gi )
{
	int nWidth, nHeight, nPlanes, nColorDepth, nColorNumber;

	if( m_nImageType == 0 )
	{
		m_nLastError = GL_UNSUPPORTED_FILETYPE;
		return( false );
	}
	switch( m_nImageType )
	{
		case GT_BMP:
			if( ::GetBMPInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( true );
			}
		  break;
		case GT_GIF:
			if( ::GetGIFInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( true );
			}
		  break;
		case GT_JPG:
			if( ::GetJPGInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( true );
			}
		  break;
		case GT_PCX:
			if( ::GetPCXInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( true );
			}
		  break;
		case GT_TGA:
			if( ::GetTGAInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( true );
			}
		  break;
		case GT_TIF:
			if( ::GetTIFInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( true );
			}
		  break;
	}
	return( false );
}

ImageINFO *CImageObject::GetImageInfo( void )
{
	int nWidth, nHeight, nPlanes, nColorDepth, nColorNumber;

	if( m_nImageType == 0 )
	{
		m_nLastError = GL_UNSUPPORTED_FILETYPE;
		return( false );
	}
	switch( m_nImageType )
	{
		case GT_BMP:
			if( ::GetBMPInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
      	ImageINFO *gi = new ImageINFO;
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( gi );
			}
		  break;
		case GT_GIF:
			if( ::GetGIFInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
      	ImageINFO *gi = new ImageINFO;
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( gi );
			}
		  break;
		case GT_JPG:
			if( ::GetJPGInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
      	ImageINFO *gi = new ImageINFO;
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( gi );
			}
		  break;
		case GT_PCX:
			if( ::GetPCXInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
      	ImageINFO *gi = new ImageINFO;
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( gi );
			}
		  break;
		case GT_TGA:
			if( ::GetTGAInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
      	ImageINFO *gi = new ImageINFO;
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( gi );
			}
		  break;
		case GT_TIF:
			if( ::GetTIFInfo( m_pszFileName, &nWidth, &nHeight, &nPlanes, &nColorDepth, &nColorNumber ) )
			{
      	ImageINFO *gi = new ImageINFO;
			  gi->nWidth = nWidth;
			  gi->nHeight = nHeight;
			  gi->nPlanes = nPlanes;
			  gi->nColorDepth = nColorDepth;
			  gi->nColorNumber = nColorNumber;
				return( gi );
			}
		  break;
	}
	return( NULL );
}

// Change color depth of the Image
bool CImageObject::SetColorDepth( int nColorDepth )
{
	m_nLastError = GL_SUCCESS;
	if( nColorDepth == m_nBits )
		return( true );
	int nOldWidthInBytes, nNewWidthInBytes;
	char *pBuffer = ( char * )GetDIBPointer( &nOldWidthInBytes, nColorDepth, &nNewWidthInBytes );
	if( pBuffer == NULL )
		return( false );

	BITMAPINFOHEADER *pOldBIH, *pNewBIH;
	BITMAPFILEHEADER *pOldBFH, *pNewBFH;
	RGBQUAD *pOldRGBPalette, *pNewRGBPalette;
	unsigned char *pOldBits, *pNewBits;
	int nOldColors, nNewColors;
	pOldBFH = ( BITMAPFILEHEADER * )pBuffer;
	pOldBIH = ( BITMAPINFOHEADER * )&pBuffer[ sizeof( BITMAPFILEHEADER ) ];
	pOldRGBPalette = ( RGBQUAD * )&pBuffer[ sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) ];
	nOldColors = m_nColors;
	nNewColors = 1 << nColorDepth;
	if( nColorDepth > 8 )
		nNewColors = 0;
	pOldBits = ( unsigned char * )&pBuffer[ sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER) + nOldColors * sizeof( RGBQUAD ) ];
	if( m_nBits >= 16 && nColorDepth < 16 )
	{
		if( m_pLogPalette != NULL )
			delete[] m_pLogPalette;
		m_pLogPalette = CreatePaletteFromBitmap( nNewColors, pOldBits, m_nBits, m_nWidth, m_nHeight );
	}

	HGLOBAL hGlobal;
	DWORD dwSize;
	dwSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + nNewColors * sizeof( RGBQUAD ) + m_nHeight * nNewWidthInBytes;
	hGlobal = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );
	if( hGlobal == NULL )
	{
		::GlobalUnlock( m_hDib );
		return( false );
	}
	pBuffer = (char *) ::GlobalLock( hGlobal );
	if( pBuffer == NULL )
	{
		::GlobalFree( hGlobal );
		::GlobalUnlock( m_hDib );
		return( false );
	}

	pNewBFH = ( BITMAPFILEHEADER * )pBuffer;
	pNewBIH = ( BITMAPINFOHEADER * )&pBuffer[ sizeof( BITMAPFILEHEADER ) ];
	pNewRGBPalette = ( RGBQUAD * )&pBuffer[ sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) ];
	*pNewBFH = *pOldBFH;
	*pNewBIH = *pOldBIH;
	int i, j = nNewColors;
	if( m_nBits < 16 && nColorDepth < 16 )
	{
		for( i=0; i<j; i++ )
			pNewRGBPalette[i] = pOldRGBPalette[i];
	}
	else if( m_nBits >= 16 )
	{
 		for( i=0; i<j; i++ )
		{
			pNewRGBPalette[ i ].rgbRed = m_pLogPalette->palPalEntry[ i ].peRed;
			pNewRGBPalette[ i ].rgbGreen = m_pLogPalette->palPalEntry[ i ].peGreen;
			pNewRGBPalette[ i ].rgbBlue = m_pLogPalette->palPalEntry[ i ].peBlue;
		}
	}

	pNewBIH->biBitCount = nColorDepth;
	pNewBIH->biSizeImage = nNewWidthInBytes * m_nHeight;
	pNewBIH->biClrUsed = nNewColors;
	pNewBFH->bfSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + nNewColors * sizeof( RGBQUAD ) + pNewBIH->biSizeImage;
	pNewBFH->bfOffBits = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + nNewColors * sizeof( RGBQUAD );
	pNewBits = ( unsigned char * )&pBuffer[ sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + nNewColors * sizeof( RGBQUAD ) ];
	m_nPaletteInBytes = nNewColors * sizeof( RGBQUAD );
	for( int y=0; y<m_nHeight; y++ )
	{
		unsigned char ucRed, ucGreen, ucBlue;
		unsigned char *pSrc, *pDest;
		pSrc = pOldBits;

⌨️ 快捷键说明

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