📄 imagebmp.cpp
字号:
// ImageBmp.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
/*********************************************************
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType; // 厚飘甘阑 钎矫 (亲惑 "BM")
DWORD bfSize; // 傈眉 颇老 农扁
WORD bfReserved1; // 抗距等 蔼
WORD bfReserved2; // 抗距等 蔼
DWORD bfOffBits; // 角力 捞固瘤 厚飘鳖瘤狼 可悸
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize; // 捞 备炼眉狼 农扁
LONG biWidth; // 捞固瘤狼 气 (侨伎 窜困)
LONG biHeight; // 捞固瘤狼 臭捞 (侨伎 窜困)
WORD biPlanes; // 厚飘敲饭牢 荐 (亲惑 1)
WORD biBitCount // 侨伎 寸 厚飘 荐
DWORD biCompression; // 拘绵 蜡屈
DWORD biSizeImage; // 捞固瘤狼 农扁(官捞飘 荐)
LONG biXPelsPerMeter; // 啊肺 秦惑档
LONG biYPelsPerMeter; // 技肺 秦惑档
DWORD biClrUsed; // 角力 荤侩登绰 祸惑 荐
DWORD biClrImportant; // 吝夸茄 祸惑 牢郸胶 (0捞搁 傈眉)
} BITMAPINFOHEADER;
*********************************************************/
// BMP 颇老阑 阂矾坷扁
BOOL IEDib::LoadBMP(LPCTSTR lpszFileName)
{
CFile file;
DWORD dwDibSize;
LPSTR lpDib;
BITMAPFILEHEADER bmfh;
// 佬扁 葛靛肺 颇老 凯扁
if( !file.Open(lpszFileName, CFile::modeRead) )
return FALSE;
// 颇老 庆歹 佬扁
if( file.Read((LPSTR)&bmfh, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER) )
{
file.Close();
return FALSE;
}
// BMP 颇老烙阑 唱鸥郴绰 "BM" 付目啊 乐绰瘤 犬牢
if( bmfh.bfType != ((WORD) ('M' << 8) | 'B') )
{
file.Close();
return FALSE;
}
// packed-DIB 皋葛府 喉钒狼 农扁
dwDibSize = bmfh.bfSize - sizeof(BITMAPFILEHEADER);
// 皋葛府 且寸
if( (m_hDib = (HGLOBAL)::GlobalAlloc(GHND, dwDibSize)) == NULL )
{
file.Close();
return FALSE;
}
// 皋葛府 绊沥
if( (lpDib = (LPSTR)::GlobalLock((HGLOBAL)m_hDib)) == NULL )
{
::GlobalFree( m_hDib );
m_hDib = NULL;
file.Close();
return FALSE;
}
// 颇老肺何磐 Packed-DIB 农扁父怒阑 佬扁
if( file.ReadHuge(lpDib, dwDibSize) != dwDibSize )
{
::GlobalUnlock( m_hDib );
::GlobalFree( m_hDib );
m_hDib = NULL;
file.Close();
return FALSE;
}
// IEDib 糕滚 函荐 檬扁拳
if( !InitDib(lpDib) )
{
::GlobalUnlock( m_hDib );
::GlobalFree( m_hDib );
m_hDib = NULL;
file.Close();
return FALSE;
}
// BMP 颇老 肺靛啊 己傍利栏肺 场巢.
::GlobalUnlock((HGLOBAL) m_hDib);
file.Close();
return TRUE;
}
// BMP 颇老肺 历厘窍扁
BOOL IEDib::SaveBMP(LPCTSTR lpszFileName)
{
CFile file;
LPSTR lpDib;
BITMAPFILEHEADER bmfh;
LPBITMAPINFOHEADER lpbmi;
if( m_hDib == NULL )
return FALSE;
// 静扁 葛靛肺 颇老 凯扁
if( !file.Open(lpszFileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite) )
return FALSE;
// 皋葛府 绊沥
lpDib = (LPSTR)::GlobalLock( m_hDib );
if( lpDib == NULL )
return FALSE;
lpbmi = (LPBITMAPINFOHEADER)lpDib;
// 荤侩登绰 祸惑 荐
int nColors = GetColorNums();
// 厚飘甘 颇老 庆歹 沥焊 汲沥
bmfh.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
bmfh.bfSize = GlobalSize( m_hDib ) + sizeof(bmfh);
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = (DWORD)( sizeof(bmfh) + lpbmi->biSize + nColors * sizeof(RGBQUAD) );
// BITMAPFILEHEADER 静扁
file.Write( &bmfh, sizeof(bmfh) );
// BITMAPINFOHEADER + PALETTE TABLE + RAW DATA 静扁
file.Write( lpDib, GlobalSize( m_hDib ) );
// 颇老 摧扁
file.Close();
// 绊沥等 皋葛府 喉钒阑 秦力
::GlobalUnlock( m_hDib );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -