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

📄 imagecolor.cpp

📁 刚上传内容的相关CODEC不能单独上传。于是
💻 CPP
字号:
// ImageColor.cpp: implementation of the CImageColor class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ImageColor.h"
#include "Image.h"
#include "ColorPixel.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CImageColor::CImageColor()
{
	m_pImage = NULL;
}

CImageColor::CImageColor(CImage* pImage)
{
	m_pImage = pImage;
}

CImageColor::~CImageColor()
{

}

void CImageColor::SetImage(CImage* pImage)
{
	m_pImage = pImage;
}

CImage* CImageColor::ConvertGray(BOOL newImage)
{
	if( !m_pImage || !m_pImage->IsValidate() ) return NULL;

	//if( m_pImage->IsROI() ) m_pImage->DeleteROI();

	CImage* pImage = NULL;
	
	CSize size = m_pImage->GetImageSize();

	int i,j;

	if( newImage )
	{
		if( m_pImage->GetColorMode() == INDEXED )
		{
			if( m_pImage->IsGray() )
				pImage = new CImage(m_pImage);
			else
			{
				pImage = new CImage( size, INDEXED, 0 );
				if( !pImage ) return NULL;

				BYTE gray[256];
				RGBQUAD* pPal = m_pImage->GetPalPtr();
				for( i = 0 ; i < 256 ; i++ )
					gray[i] = (BYTE)((pPal[i].rgbRed+pPal[i].rgbGreen+pPal[i].rgbBlue)/3.+0.5);

				BYTE** src = m_pImage->GetPtr();
				BYTE** des = pImage->GetPtr();				
				for( j = 0 ; j < size.cy ; j++ )
				{
					for( i = 0 ; i < size.cx ; i++ )
						des[j][i] = gray[src[j][i]];
				}
			}
		}
		else
		{
			pImage = new CImage( size, INDEXED, 0 );
			if( !pImage ) return NULL;

			CColorPixel** src = m_pImage->GetColorPtr();
			BYTE** des = pImage->GetPtr();
			
			for( j = 0 ; j < size.cy ; j++ )
			{
				for( i = 0 ; i < size.cx ; i++ )
					des[j][i] = (BYTE)((src[j][i].r+src[j][i].g+src[j][i].b)/3.+0.5); 
			}			
		}
	}
	else
	{
		if( m_pImage->GetColorMode() == INDEXED )
		{
			if( !m_pImage->IsGray() )			
			{
				BYTE gray[256];
				RGBQUAD* pPal = m_pImage->GetPalPtr();
				for( i = 0 ; i < 256 ; i++ )
				{
					gray[i] = (BYTE)((pPal[i].rgbRed+pPal[i].rgbGreen+pPal[i].rgbBlue)/3.+0.5);
					pPal[i].rgbRed = pPal[i].rgbGreen = pPal[i].rgbBlue = i;
				}

				BYTE** ptr = m_pImage->GetPtr();				
				for( j = 0 ; j < size.cy ; j++ )
				{
					for( i = 0 ; i < size.cx ; i++ )
						ptr[j][i] = gray[ptr[j][i]];
				}
				m_pImage->UpdatePalette();
			}
		}
		else
		{
			pImage = new CImage( size, INDEXED, 0 );
			if( !pImage ) return NULL;

			CColorPixel** src = m_pImage->GetColorPtr();
			BYTE** des = pImage->GetPtr();
			
			for( j = 0 ; j < size.cy ; j++ )
			{
				for( i = 0 ; i < size.cx ; i++ )
					des[j][i] = (BYTE)((src[j][i].r+src[j][i].g+src[j][i].b)/3.+0.5); 
			}			
			*m_pImage = *pImage;
			delete pImage;
			pImage = NULL;
		}
	}
	
	return pImage;
}

CImage* CImageColor::ConvertTrueColor(BOOL newImage)
{
	if( !m_pImage || !m_pImage->IsValidate() ) return NULL;

	//if( m_pImage->IsROI() ) m_pImage->DeleteROI();
	
	CImage* pImage = NULL;

	CSize size = m_pImage->GetImageSize();
	int i,j;

	if( newImage )
	{
		if( m_pImage->GetColorMode() == TRUERGB )
		{
			pImage = new CImage(m_pImage);			
		}
		else
		{		
			pImage = new CImage( size, TRUERGB, 0 );
			RGBQUAD* pPal = m_pImage->GetPalPtr();
			BYTE** src = m_pImage->GetPtr();
			CColorPixel** des = pImage->GetColorPtr();
			
			for( j = 0 ; j < size.cy ; j++ )
			{
				for( i = 0 ; i < size.cx ; i++ )
				{
					des[j][i].r = pPal[src[j][i]].rgbRed;
					des[j][i].g = pPal[src[j][i]].rgbGreen;
					des[j][i].b = pPal[src[j][i]].rgbBlue;
				}
			}
		}
	}
	else
	{
		if( m_pImage->GetColorMode() != TRUERGB )
		{
			pImage = new CImage( size, TRUERGB, 0 );
			if( !pImage ) return NULL;

			RGBQUAD* pPal = m_pImage->GetPalPtr();
			BYTE** src = m_pImage->GetPtr();
			CColorPixel** des = pImage->GetColorPtr();
			
			for( j = 0 ; j < size.cy ; j++ )
			{
				for( i = 0 ; i < size.cx ; i++ )
				{
					des[j][i].r = pPal[src[j][i]].rgbRed;
					des[j][i].g = pPal[src[j][i]].rgbGreen;
					des[j][i].b = pPal[src[j][i]].rgbBlue;
				}
			}
			*m_pImage = *pImage;
			delete pImage;
			pImage = NULL;
		}
	}	
	return pImage;
}

BOOL CImageColor::ConvertGray(CImage* pImage)
{
	if( !m_pImage || !m_pImage->IsValidate() ) return FALSE;
	if( !pImage ) return FALSE;

	//if( m_pImage->IsROI() ) m_pImage->DeleteROI();
	
	
	CSize size = m_pImage->GetImageSize();

	int i,j;

	if( m_pImage->GetColorMode() == INDEXED )
	{
		if( m_pImage->IsGray() )
		{
			BYTE** src = m_pImage->GetPtr();
			BYTE** des = pImage->GetPtr();				
			for( j = 0 ; j < size.cy ; j++ )
				memcpy( des[j], src[j], sizeof(BYTE)*size.cx );
		}
		else
		{
			BYTE gray[256];
			RGBQUAD* pPal = m_pImage->GetPalPtr();
			for( i = 0 ; i < 256 ; i++ )
				gray[i] = (BYTE)((pPal[i].rgbRed+pPal[i].rgbGreen+pPal[i].rgbBlue)/3.+0.5);
			
			BYTE** src = m_pImage->GetPtr();
			BYTE** des = pImage->GetPtr();				
			for( j = 0 ; j < size.cy ; j++ )
			{
				for( i = 0 ; i < size.cx ; i++ )
					des[j][i] = gray[src[j][i]];
			}
		}
	}
	else
	{
		CColorPixel** src = m_pImage->GetColorPtr();
		BYTE** des = pImage->GetPtr();
		
		for( j = 0 ; j < size.cy ; j++ )
		{
			for( i = 0 ; i < size.cx ; i++ )
				des[j][i] = (BYTE)((src[j][i].r+src[j][i].g+src[j][i].b)/3.+0.5);
		}			
	}
	return TRUE;
}

⌨️ 快捷键说明

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