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