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

📄 iedib.cpp

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

#include "stdafx.h"
#include "IEDib.h"

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

#define IS_WIN30_DIB(lpDib)	((*(LPDWORD)(lpDib)) == sizeof(BITMAPINFOHEADER))
#define PALVERSION   0x300

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

IEDib::IEDib()
{
	m_hDib     = NULL;

	m_nWidth     = 0;
	m_nRWidth    = 0;
	m_nHeight    = 0;
	m_nBitCount  = 0;

	m_pPal       = NULL;
}

IEDib::~IEDib()
{
	if( m_hDib )		GlobalFree( m_hDib );
	if( m_pPal )		delete m_pPal;
}

//////////////////////////////////////////////////////////////////////
// File Create/Load/Save Functions
//////////////////////////////////////////////////////////////////////

BOOL IEDib::CreateGrayImage(int nWidth, int nHeight, BYTE value)
{
	int nBitCount = 8;
	LPSTR lpDib;
	LPBITMAPINFOHEADER lpbmi;
	BYTE*  pPal;
	DWORD  dwSizeImage;
	int    i;

	dwSizeImage = nHeight * (DWORD)((nWidth*nBitCount/8+3)&~3);

	m_hDib = ::GlobalAlloc( GHND, sizeof(BITMAPINFOHEADER) + 1024 + dwSizeImage );

	if( m_hDib == NULL )
		return FALSE;

	lpDib = (LPSTR)::GlobalLock( m_hDib );

	lpbmi = (LPBITMAPINFOHEADER)lpDib;
	lpbmi->biSize = sizeof(BITMAPINFOHEADER);
	lpbmi->biWidth = nWidth;
	lpbmi->biHeight = nHeight;
	lpbmi->biPlanes = 1;
	lpbmi->biBitCount = nBitCount;
	lpbmi->biCompression = BI_RGB;
	lpbmi->biSizeImage = dwSizeImage;
	lpbmi->biXPelsPerMeter = 0;
	lpbmi->biYPelsPerMeter = 0;
	lpbmi->biClrUsed = 0;
	lpbmi->biClrImportant = 0;

	pPal = (BYTE*)lpbmi;
	lpbmi->biClrUsed = 256;

	DWORD offDest = sizeof(BITMAPINFOHEADER);
	for( i = 0 ; i < 256 ; i++ )
	{
		pPal[offDest++] = (BYTE)i;
		pPal[offDest++] = (BYTE)i;
		pPal[offDest++] = (BYTE)i;
		pPal[offDest++] = 0x00;
	}

	if( !InitDib(lpDib) )
	{
		::GlobalUnlock( m_hDib );
		::GlobalFree( m_hDib );
		m_hDib = NULL;
		return FALSE;
	}

	// 侨伎 蔼 檬扁拳
	BYTE* pDib = (BYTE*)GetDibBitsAddr( lpDib );
	memset( pDib, value, m_nRWidth*m_nHeight );

	::GlobalUnlock( m_hDib );

	return TRUE;
}

BOOL IEDib::CreateRGBImage(int nWidth, int nHeight, COLORREF value)
{
	int nBitCount = 24;
	LPSTR lpDib;
	LPBITMAPINFOHEADER lpbmi;
	DWORD  dwSizeImage;

	dwSizeImage = nHeight * (DWORD)((nWidth*nBitCount/8+3)&~3);

	m_hDib = ::GlobalAlloc( GHND, sizeof(BITMAPINFOHEADER) + dwSizeImage );

	if( m_hDib == NULL )
		return FALSE;

	lpDib = (LPSTR)::GlobalLock( m_hDib );

	lpbmi = (LPBITMAPINFOHEADER)lpDib;
	lpbmi->biSize = sizeof(BITMAPINFOHEADER);
	lpbmi->biWidth = nWidth;
	lpbmi->biHeight = nHeight;
	lpbmi->biPlanes = 1;
	lpbmi->biBitCount = nBitCount;
	lpbmi->biCompression = BI_RGB;
	lpbmi->biSizeImage = dwSizeImage;
	lpbmi->biXPelsPerMeter = 0;
	lpbmi->biYPelsPerMeter = 0;
	lpbmi->biClrUsed = 0;
	lpbmi->biClrImportant = 0;

	if( !InitDib(lpDib) )
	{
		::GlobalUnlock( m_hDib );
		::GlobalFree( m_hDib );
		m_hDib = NULL;
		return FALSE;
	}

	// 侨伎 蔼 檬扁拳
	int i, j;
	RGBBYTE** ptr = GetRGBPtr();
	for( j = 0 ; j < m_nHeight ; j++ )
	for( i = 0 ; i < m_nWidth ; i++ )
	{
		ptr[j][i].b = GetBValue(value);
		ptr[j][i].g = GetGValue(value);
		ptr[j][i].r = GetRValue(value);
	}
	FreePtr(ptr);

	::GlobalUnlock( m_hDib );

	return TRUE;
}

BOOL IEDib::CopyImage(IEDib* pImage)
{
	if (pImage == NULL)
		return FALSE;
	if( !pImage->IsValid() )
		return FALSE;

	if( !FromHandle( pImage->GetHandle() ) )
		return FALSE;

	return TRUE;
}

BOOL IEDib::FromHandle(HANDLE hDib)
{
	LPSTR lpSrc = (LPSTR)::GlobalLock( hDib );
	if( lpSrc == NULL )
		return FALSE;

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

	m_hDib = ::GlobalAlloc( GHND, ::GlobalSize( (HGLOBAL)hDib ) );
	if( m_hDib == NULL )
		return FALSE;

	LPSTR lpDib = (LPSTR)::GlobalLock( m_hDib );
	if( lpDib == NULL )
		return FALSE;

	// 皋葛府 喉钒 汗荤
	memcpy( lpDib, lpSrc, ::GlobalSize( (HGLOBAL)hDib ) );

	LPBITMAPINFOHEADER lpbmi;
	lpbmi = (LPBITMAPINFOHEADER)lpDib;

	m_nWidth     = lpbmi->biWidth;
	m_nHeight    = lpbmi->biHeight;
	m_nBitCount  = lpbmi->biBitCount;
	m_nRWidth    = (m_nWidth*m_nBitCount/8+3)&~3;

	// Palette 积己
	CreateDIBPalette( lpDib );

	::GlobalUnlock( lpDib );
	::GlobalUnlock( lpSrc );

	return TRUE;
}

/*
BOOL IEDib::FromImage(IEByteImage* pImage)
{
	int i, j, cnt;
	int w = pImage->GetWidth();
	int h = pImage->GetHeight();

	CreateGrayImage(w, h);

	LPSTR lpDib = (LPSTR)::GlobalLock( m_hDib );
	if( lpDib == NULL )
		return FALSE;

	BYTE** ptr = GetPtr();
	BYTE*  src = pImage->GetPixels();

	cnt = 0;
	for( j = 0 ; j < h ; j++ )
	for( i = 0 ; i < w ; i++ )
	{
		ptr[j][i] = src[cnt++];
	}
	
	FreePtr(ptr);

	::GlobalUnlock( lpDib );

	return TRUE;
}
*/

BOOL IEDib::Load(LPCTSTR lpszFileName)
{
	CString filetype;
	filetype = lpszFileName;
	filetype.MakeUpper();

	if( filetype.Right(4) == ".BMP" ) return LoadBMP(lpszFileName);
	else if( filetype.Right(4) == ".JPG" ) return LoadJPG(lpszFileName);
	else 
		return FALSE;
}

BOOL IEDib::Save(LPCTSTR lpszFileName)
{
	CString filetype;
	filetype = lpszFileName;
	filetype.MakeUpper();

	if( filetype.Right(4) == ".BMP" ) return SaveBMP(lpszFileName);
	else if( filetype.Right(4) == ".JPG" ) return SaveJPG(lpszFileName);
	else 
		return FALSE;
}

/******************************************************
  角力 弊贰侨 颇老阑 佬绢坷绰 风凭篮 促澜 颇老俊 乐澜
 
	ImageBmp.cpp : BMP 颇老 (LoadBMP, SaveBMP)
	ImageJpg.cpp : JPG 颇老 (LoadJPG, SaveJPG)
	ImageGif.cpp : GIF 颇老 (LoadGIF, SaveGIF)
	ImageTif.cpp : TIF 颇老 (LoadTIF, SaveTIF)

******************************************************/

//////////////////////////////////////////////////////////////////////
// Draw Functions
//////////////////////////////////////////////////////////////////////

void IEDib::Draw(HDC hDC)
{
	LPSTR       lpDib;
	LPSTR       lpDIBBits;
	HPALETTE    hPal = NULL;
	HPALETTE    hOldPal = NULL;

	if( m_hDib == NULL )
		return;

	if( (lpDib = (LPSTR)::GlobalLock( m_hDib )) == NULL )
		return;

	LPBITMAPINFO lpbi = (LPBITMAPINFO)lpDib;

	// raw data狼 矫累 困摹甫 备茄促.
	lpDIBBits = GetDibBitsAddr( lpDib );

	if( m_pPal != NULL )
	{	
		hPal = (HPALETTE) m_pPal->m_hObject;
		hOldPal = ::SelectPalette( hDC, hPal, TRUE );
	    RealizePalette( hDC );
	}
	else
	{
		if( SetSystemPalette( hDC ) )	RealizePalette( hDC );
	}

	::SetStretchBltMode( hDC, COLORONCOLOR );
	::SetDIBitsToDevice(	hDC,				// hDC
							0,					// DestX
							0,					// DestY
							m_nWidth,			// nSrcWidth
							m_nHeight,			// nSrcHeight
							0,					// SrcX
							0,					// SrcY
							0,					// nStartScan
							(WORD)m_nHeight,	// nNumScans
							lpDIBBits,			// lpBits
							lpbi,				// lpBitsInfo
							DIB_RGB_COLORS );	// wUsage

	::GlobalUnlock( m_hDib );

	if( hOldPal != NULL )
		::SelectPalette( hDC, hOldPal, TRUE );
}

void IEDib::Draw(HDC hDC, int dx, int dy)
{
	Draw(hDC, dx, dy, GetWidth(), GetHeight());
}

void IEDib::Draw(HDC hDC, int dx, int dy, int dw, int dh, DWORD dwRop)
{
	LPSTR       lpDib;
	LPSTR       lpDIBBits;
	HPALETTE    hPal = NULL;
	HPALETTE    hOldPal = NULL;

	if( m_hDib == NULL )
		return;

	if( (lpDib = (LPSTR)::GlobalLock( m_hDib )) == NULL )
		return;

	LPBITMAPINFO lpbi = (LPBITMAPINFO)lpDib;

	// raw data狼 矫累 困摹甫 备茄促.
	lpDIBBits = GetDibBitsAddr( lpDib );

	if( m_pPal != NULL )
	{	
		hPal = (HPALETTE) m_pPal->m_hObject;
		hOldPal = ::SelectPalette( hDC, hPal, TRUE );
	    RealizePalette( hDC );
	}
	else
	{
		if( SetSystemPalette( hDC ) )	RealizePalette( hDC );
	}

	::SetStretchBltMode( hDC, COLORONCOLOR );
	::StretchDIBits(	hDC,				// hDC
						dx,					// XDest
						dy,					// YDest
						dw,					// nDestWidth
						dh,					// nDestHeight
						0,					// XSrc
						0,					// YSrc
						m_nWidth,			// nSrcWidth
						m_nHeight,			// nSrcHeight
						lpDIBBits,			// lpBits
						lpbi,				// lpBitsInfo
						DIB_RGB_COLORS,		// wUsage
						SRCCOPY);			// dwROP

	::GlobalUnlock( m_hDib );

	if( hOldPal != NULL )
		::SelectPalette( hDC, hOldPal, TRUE );
}

//////////////////////////////////////////////////////////////////////
// Palette Functions
//////////////////////////////////////////////////////////////////////

/*********************************************************************
typedef struct tagLOGPALETTE { // lgpl 
    WORD         palVersion;		// 亲惑 0x300
    WORD         palNumEntries;		// 颇房飘狼 祸惑 荐
    PALETTEENTRY palPalEntry[1]; 
} LOGPALETTE; 

typedef struct tagPALETTEENTRY { // pe 
    BYTE peRed;	
    BYTE peGreen; 
    BYTE peBlue; 
    BYTE peFlags; 
} PALETTEENTRY; 
*********************************************************************/

BOOL IEDib::CreateDIBPalette(LPSTR lpDib)
{
	int nColorNums = GetColorNums();

	if( nColorNums == 0 )		// not indexed color
		return TRUE;

	// palette buffer allocate
	HANDLE hPal = ::GlobalAlloc( GHND, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * nColorNums );

	if( hPal == NULL )
		return FALSE;

	// palette buffer lock. 
	LPLOGPALETTE lpPal = (LPLOGPALETTE)::GlobalLock( (HGLOBAL)hPal );

	if( lpPal == NULL )
		return FALSE;

	lpPal->palVersion = PALVERSION;
	lpPal->palNumEntries = (WORD)nColorNums;

    // 漠扼 荐父怒 迫饭飘甫 迫饭飘 浚飘府俊 持绰促.
	if( IS_WIN30_DIB(lpDib) ) //win 3.0 DIB 捞惑滚傈老版快 
	{
		LPBITMAPINFO lpbmi = (LPBITMAPINFO)lpDib;

		for(int i = 0 ; i < nColorNums ; i++ )
		{
			lpPal->palPalEntry[i].peRed		= lpbmi->bmiColors[i].rgbRed;
			lpPal->palPalEntry[i].peGreen	= lpbmi->bmiColors[i].rgbGreen;
			lpPal->palPalEntry[i].peBlue	= lpbmi->bmiColors[i].rgbBlue;
			lpPal->palPalEntry[i].peFlags	= 0;
		}
	}
	else 
	{
		LPBITMAPCOREINFO lpbmc = (LPBITMAPCOREINFO)lpDib;

		for(int i = 0 ; i < nColorNums ; i++ )
		{
			lpPal->palPalEntry[i].peRed		= lpbmc->bmciColors[i].rgbtRed;
			lpPal->palPalEntry[i].peGreen	= lpbmc->bmciColors[i].rgbtGreen;
			lpPal->palPalEntry[i].peBlue	= lpbmc->bmciColors[i].rgbtBlue;
			lpPal->palPalEntry[i].peFlags	= 0;
		}
	}

	// CPalette 备炼眉俊 lpPal甫 傅农矫难辑 迫饭飘甫 父电促.
	if( m_pPal )
		delete m_pPal;
	
	m_pPal = new CPalette;
    m_pPal->CreatePalette( lpPal );

	::GlobalUnlock( hPal );
	::GlobalFree( hPal );

	return TRUE;
}

LPSTR IEDib::GetDibBitsAddr(LPSTR lpDib)
{
	DWORD dwNumColors, dwColorTableSize ;
	WORD  wBitCount ;

	if( IS_WIN30_DIB(lpDib) )
	{
		LPBITMAPINFOHEADER lpbmi = (LPBITMAPINFOHEADER)lpDib;
		wBitCount = lpbmi->biBitCount;

		if( lpbmi->biSize >= 36 )
			dwNumColors = lpbmi->biClrUsed ;
		else
			dwNumColors = 0 ;

		if( dwNumColors == 0 )
		{
			if( wBitCount != 24 )
				dwNumColors = 1L << wBitCount ;
			else
				dwNumColors = 0 ;
		}

		dwColorTableSize = dwNumColors * sizeof(RGBQUAD);
	}
	else
	{
		LPBITMAPCOREHEADER lpbmc = (LPBITMAPCOREHEADER)lpDib;
		wBitCount = lpbmc->bcBitCount ;

		if( wBitCount != 24 )
			dwNumColors = 1L << wBitCount ;
		else
			dwNumColors = 0 ;

		dwColorTableSize = dwNumColors * sizeof(RGBTRIPLE);
	}

	return lpDib + ((LPBITMAPINFOHEADER)lpDib)->biSize + dwColorTableSize ;
}

int IEDib::SetSystemPalette(HDC hDC)
{
	//泅犁 飘风漠扼葛靛捞搁 汲沥救窃
	if( GetColorNums() != 0 ) return FALSE;

	if( ! (::GetDeviceCaps( hDC, RASTERCAPS ) & RC_PALETTE) ) return FALSE;

	//泅犁 葛靛啊 割漠扼 葛靛捞哥 迫饭飘浚飘府啊 割俺牢瘤 犬牢
	int nSysColors	= ::GetDeviceCaps( hDC, NUMCOLORS );
	int nPalEntries = ::GetDeviceCaps( hDC, SIZEPALETTE );

	if( nPalEntries == 0 )
	{
		return FALSE;
	}
		
	int nEntries = nPalEntries;

	LPLOGPALETTE pLogPal = (LPLOGPALETTE) new char[2 * sizeof(WORD) + nEntries * sizeof(PALETTEENTRY)];
	pLogPal->palVersion = 0x300;
	pLogPal->palNumEntries = nEntries;
	
	//矫胶袍 迫饭飘甫 掘绊
	::GetSystemPaletteEntries( hDC, 0, nEntries, (LPPALETTEENTRY)((LPBYTE) pLogPal + 2 * sizeof(WORD)) );
    HPALETTE hPalette;
	
	//矫胶袍 迫饭飘甫 汲沥茄促.
	hPalette = ::CreatePalette( pLogPal );
	SelectPalette( hDC, hPalette, TRUE );
	
	delete pLogPal;

	return TRUE;
}

// lpDib肺何磐 蔼阑 佬绢辑 糕滚 函荐狼 蔼苞 迫房飘 汲沥
BOOL IEDib::InitDib(LPSTR lpDib)
{
	// Win 3.0 DIB 牢 版快
	if( IS_WIN30_DIB(lpDib) )
	{
		LPBITMAPINFOHEADER lpbmi = (LPBITMAPINFOHEADER)lpDib;

		m_nWidth = lpbmi->biWidth;
		m_nHeight = lpbmi->biHeight;
		m_nBitCount = lpbmi->biBitCount;
	}
	// Win 3.0 DIB 啊 酒囱 版快( OS/2 DIB )
	else
	{
		LPBITMAPCOREHEADER lpbmc = (LPBITMAPCOREHEADER)lpDib;

		m_nWidth = lpbmc->bcWidth;
		m_nHeight = lpbmc->bcHeight;
		m_nBitCount = lpbmc->bcBitCount;
	}

	m_nRWidth = ( m_nWidth*m_nBitCount/8 + 3 )&~3;

	if( !CreateDIBPalette(lpDib) )
	{
		delete m_pPal;
		m_pPal = NULL;
		return FALSE;
	}

	return TRUE;
}

int IEDib::GetColorNums()
{
	switch( m_nBitCount )
	{
		case 1:     return 2;
		case 4:     return 16;
		case 8:     return 256;
		default:    return 0;
	}
}

//////////////////////////////////////////////////////////////////////
// Pixel Pointer Function
//////////////////////////////////////////////////////////////////////

BYTE** IEDib::GetPtr()
{
	if( m_hDib == NULL || GetColorNums() != 256 )
		return NULL;

	// 咯扁辑 Lock 茄 勤甸篮 FreePtr()俊辑 秦力秦林绢具 茄促.
	LPSTR lpDib = (LPSTR)::GlobalLock( m_hDib );
	if( lpDib == NULL )
		return NULL;

	BYTE* pDib = (BYTE*)GetDibBitsAddr( lpDib );

	BYTE** ptr;
	ptr = new BYTE*[m_nHeight];
	for( int i = 0 ; i < m_nHeight ; i++ )
		ptr[i] = pDib + (m_nHeight - 1 - i)*m_nRWidth;

	return ptr;
}

RGBBYTE** IEDib::GetRGBPtr()
{
	if( m_hDib == NULL || GetColorNums() != 0 )
		return NULL;
	
	// 咯扁辑 Lock 茄 勤甸篮 FreePtr()俊辑 秦力秦林绢具 茄促.
	LPSTR lpDib = (LPSTR)::GlobalLock( m_hDib );
	if( lpDib == NULL )
		return NULL;
	
	BYTE* pDib = (BYTE*)GetDibBitsAddr( lpDib );
	
	RGBBYTE** ptr;
	ptr = new RGBBYTE*[m_nHeight];
	for( int i = 0 ; i < m_nHeight ; i++ )
		ptr[i] = (RGBBYTE*)(pDib + (m_nHeight - 1 - i)*m_nRWidth);
	
	return ptr;
}

void IEDib::FreePtr(BYTE** ptr)
{
	if( ptr == NULL )	return;

	delete [] ptr;
	ptr = NULL;

	::GlobalUnlock( m_hDib );
}

void IEDib::FreePtr(RGBBYTE** ptr)
{
	if( ptr == NULL )	return;
	
	delete [] ptr;
	ptr = NULL;
	
	::GlobalUnlock( m_hDib );
}

⌨️ 快捷键说明

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