📄 imagecolor.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 + -