📄 dibobject.cpp
字号:
//基本功能:本函数返回文件名指定的图像类型。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nWidth
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::ExtensionIndex( const char *pszFilename )
{
int Index = 0;
char *pszExtension;
pszExtension = (char *) &pszFilename[strlen(pszFilename)-4];
while( szExtensions[Index][0] )
{
if( !stricmp( pszExtension, szExtensions[Index] ) ) return( Index + 1 );
Index++;
}
return( -1 );
}
////////////////////////////////////////////////////////////////////////
//int GetWidth()
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素宽度数。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nWidth
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::GetWidth( void )
{
return( m_nWidth );
}
////////////////////////////////////////////////////////////////////////
//int GetHeight( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素高度数。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nHeight
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int CDibObject::GetHeight( void )
{
return( m_nHeight );
}
////////////////////////////////////////////////////////////////////////
//int GetNumBits( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像的像素数:1、4、8、16、24、32。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nBits
////////////////////////////////////////////////////////////////////////
int CDibObject::GetNumBits( void )
{
return( m_nBits );
}
////////////////////////////////////////////////////////////////////////
//int GetNumColors( void )
//----------------------------------------------------------------------
//基本功能:本函数返回图像调色板中的颜色。图像为16位色或更高时返回值为0。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nColors
////////////////////////////////////////////////////////////////////////
int CDibObject::GetNumColors( void )
{
return( m_nColors );
}
////////////////////////////////////////////////////////////////////////
//BOOL GetPaletteData()
//----------------------------------------------------------------------
//基本功能:本函数将当前RGB调色板数据填入到所传入的指针中。如果图像是16
// 位色或更高时则不进行任何操作。
//----------------------------------------------------------------------
//参数说明:RGBQUAD *pRGBPalette
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::GetPaletteData( RGBQUAD *pRGBPalette )
{
m_nLastError = IMAGELIB_HDIB_NULL;
if( m_hDib == NULL ) return( FALSE );
char *pTemp;
pTemp = (char *) ::GlobalLock( m_hDib );
m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
if( pTemp == NULL ) return( FALSE );
memcpy( pRGBPalette, &pTemp[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)],
m_nPaletteBytes );
m_nLastError = IMAGELIB_SUCCESS;
::GlobalUnlock( m_hDib );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//RGBQUAD GetPaletteData()
//----------------------------------------------------------------------
//基本功能:本函数返回一个指向CDibObject调色板数据序列的指针。如果图像
// 是16位色或更高时则返回NULL。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:返回一个指向CDibObject调色板数据序列的指针
////////////////////////////////////////////////////////////////////////
RGBQUAD *CDibObject::GetPaletteData( void )
{
m_nLastError = IMAGELIB_HDIB_NULL;
if( m_hDib == NULL ) return( NULL );
m_nLastError = IMAGELIB_NO_PALETTE_FOR_HIGH_COLOR;
if( m_nColors <= 0 || m_nColors > 256 ) return( NULL );
RGBQUAD *pRGBPalette;
pRGBPalette = new RGBQUAD [m_nColors];
if( pRGBPalette == NULL )
{
m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
return( NULL );
}
char *pTemp;
pTemp = (char *) ::GlobalLock( m_hDib );
m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
if( pTemp == NULL )
{
delete [] pRGBPalette;
return( NULL );
}
memcpy( pRGBPalette, &pTemp[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)],
m_nColors * sizeof( RGBQUAD ) );
m_nLastError = IMAGELIB_SUCCESS;
::GlobalUnlock( m_hDib );
return( pRGBPalette );
}
////////////////////////////////////////////////////////////////////////
//int GetImageType()
//----------------------------------------------------------------------
//基本功能:本函数返回图像的类型。图像类型定义如下:
// #define IMAGETYPE_NONE 0
// #define IMAGETYPE_BMP 1
// #define IMAGETYPE_GIF 2
// #define IMAGETYPE_PCX 3
// #define IMAGETYPE_TGA 4
// #define IMAGETYPE_JPG 5
// #define IMAGETYPE_TIF 6
//----------------------------------------------------------------------
//参数说明:const char *pFilename
//----------------------------------------------------------------------
//返 回 值:int nImageType
////////////////////////////////////////////////////////////////////////
int CDibObject::GetImageType( const char *pFilename )
{
return( ::FileType( pFilename ) );
}
////////////////////////////////////////////////////////////////////////
//int GetImageType()
//----------------------------------------------------------------------
//基本功能:本函数返回图像的类型。图像类型定义如下:
// #define IMAGETYPE_NONE 0
// #define IMAGETYPE_BMP 1
// #define IMAGETYPE_GIF 2
// #define IMAGETYPE_PCX 3
// #define IMAGETYPE_TGA 4
// #define IMAGETYPE_JPG 5
// #define IMAGETYPE_TIF 6
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:int nImageType
////////////////////////////////////////////////////////////////////////
int CDibObject::GetImageType( void )
{
return( m_nImageType );
}
////////////////////////////////////////////////////////////////////////
//BOOL Draw( CDC *pDC, int nX, int nY )
//----------------------------------------------------------------------
//基本功能:本函数是在设备描述表上绘制图像。如果X和Y坐标没有给出,图像会
// 被画在(0,0)坐标或上次传入的有效坐标处。
//----------------------------------------------------------------------
//参数说明:CDC *pDC
// int nX,默认为-1
// int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::Draw( CDC *pDC, int nX, int nY )
{
if( nX != -1 ) m_nX = nX;
if( nY != -1 ) m_nY = nY;
m_nLastError = IMAGELIB_HDIB_NULL;
//没有打开图像
if( m_hDib == NULL ) return( FALSE );
char *pTemp;
//锁定图像对象句柄
pTemp = (char *) ::GlobalLock( m_hDib );
m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
if( pTemp == NULL ) return( NULL );
//图像信息头
BITMAPINFOHEADER *pBIH;
pBIH = (BITMAPINFOHEADER *) &pTemp[sizeof(BITMAPFILEHEADER)];
int nRet = ::StretchDIBits( pDC->m_hDC, m_nX, m_nY, m_nWidth, m_nHeight, 0, 0,
m_nWidth, m_nHeight,
(const void FAR *) &pTemp[sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)+
m_nPaletteBytes],
(BITMAPINFO *) pBIH, DIB_RGB_COLORS, SRCCOPY );
::GlobalUnlock( m_hDib );
m_nLastError = IMAGELIB_STRETCHDIBITS_ERROR;
if( nRet != m_nHeight ) return( FALSE );
m_nLastError = IMAGELIB_SUCCESS;
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL CreateLogPalette()
//----------------------------------------------------------------------
//基本功能:本函数根据指定的调色板指针及颜色数创建一个逻辑调色板。
//----------------------------------------------------------------------
//参数说明:CDC *pDC
// int nX,默认为-1
// int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:创建的逻辑调色板指针
////////////////////////////////////////////////////////////////////////
LOGPALETTE *CDibObject::CreateLogPalette( RGBQUAD *pPalette,
int nNumColors )
{
LOGPALETTE *pLogPal;
int i;
if( pPalette == NULL ) return( NULL );
pLogPal = (LOGPALETTE *) new char [sizeof(LOGPALETTE) + nNumColors * sizeof(PALETTEENTRY)];
if( pLogPal == NULL ) return( NULL );
//指定调色板版本号
pLogPal->palVersion = 0x300;
//指定调色板颜色数
pLogPal->palNumEntries = (unsigned short) nNumColors;
//复制调色板各颜色项
for( i=0; i<nNumColors; i++ )
{
pLogPal->palPalEntry[i].peRed = pPalette[i].rgbRed;
pLogPal->palPalEntry[i].peGreen = pPalette[i].rgbGreen;
pLogPal->palPalEntry[i].peBlue = pPalette[i].rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
}
return( pLogPal );
}
////////////////////////////////////////////////////////////////////////
//void ProcessImageHeader()
//----------------------------------------------------------------------
//基本功能:本函数处理图像信息头各项内容。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::ProcessImageHeader( void )
{
m_nLastError = IMAGELIB_HDIB_NULL;
if( m_hDib == NULL ) return;
char *pTemp;
BITMAPINFOHEADER *pBIH;
pTemp = (char *) ::GlobalLock( m_hDib );
m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
if( pTemp == NULL ) return;
//得到图像信息头指针
pBIH = (BITMAPINFOHEADER *) &pTemp[sizeof(BITMAPFILEHEADER)];
m_nWidth = pBIH->biWidth;
m_nHeight = pBIH->biHeight;
m_nPlanes = pBIH->biPlanes;
m_nBits = pBIH->biBitCount;
m_nColors = 1 << m_nBits;
if( m_nPlanes > 1 ) m_nColors <<= ( m_nPlanes - 1 );
if( m_nBits >= 16 ) m_nColors = 0;
int nWidthBytes = WidthBytes(m_nBits, m_nWidth);
pBIH->biSizeImage = nWidthBytes * m_nHeight;
::GlobalUnlock( m_hDib );
m_nLastError = IMAGELIB_SUCCESS;
}
////////////////////////////////////////////////////////////////////////
//void ProcessPalette()
//----------------------------------------------------------------------
//基本功能:处理体调色板。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回 值:无
////////////////////////////////////////////////////////////////////////
void CDibObject::ProcessPalette( void )
{
m_nLastError = IMAGELIB_HDIB_NULL;
if( m_hDib == NULL ) return;
CWindowDC WindowDC( NULL );
m_nScreenPlanes = WindowDC.GetDeviceCaps( PLANES );
m_nScreenBits = WindowDC.GetDeviceCaps( BITSPIXEL );
m_nPaletteBytes = 0;
m_Palette.DeleteObject();
if( m_nBits <= 8 ) m_nPaletteBytes = m_nColors * sizeof( RGBQUAD );
if( m_nScreenBits >= 16 ) return;
char *pTemp;
pTemp = (char *) ::GlobalLock( m_hDib );
m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
if( pTemp == NULL ) return;
if( m_nBits <= 8 ){
RGBQUAD *pRGBPalette;
pRGBPalette = (RGBQUAD *) &pTemp[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
LOGPALETTE *pPalette;
pPalette = CreateLogPalette( pRGBPalette, m_nColors );
if( pPalette == NULL ){
m_nLastError = IMAGELIB_LOGICAL_PALETTE_CREATION_ERROR;
goto ProcessPaletteExit;
}
m_Palette.CreatePalette( pPalette );
delete [] pPalette;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -