📄 bitmap.cpp
字号:
#include "string.h"
#include "bitmap.h"
#include "clrtrans.h"
const char *bitmap::_errmsg[] =
{
"无错误",
"非法的ICON类型",
"缓冲区太小",
"只支持24位位图"
};
bitmap::_pixel_trans_func bitmap::_trans_func[ICON_TYPE_SIZE][BMP_TYPE_SIZE] =
{
{NULL/*1*/, NULL/*4*/, NULL/*8*/, NULL/*16*/, bitmap::_pixel24to8/*24*/, NULL/*32*/},
{NULL/*1*/, NULL/*4*/, NULL/*8*/, NULL/*16*/, bitmap::_pixel24to16/*24*/, NULL/*32*/},
};
const char *bitmap::error_msg()
{
return _errmsg[_errno];
}
//------------------------------------------------------------
// 成员函数 bitmap::load_file
// bool bitmap::load_file(const char *filename)
//
// 参数:
// [in]filename:BMP文件名
// 返回值:
// 如果成功,返回true, 否则返回false.
// 备注:
// 这个成员函数用来将BMP文件读到缓冲区中.
// 需要:
// 头文件: bitmap.h
// 源文件: bitmap.cpp
//------------------------------------------------------------
bool bitmap::load_file(const char *filename)
{
FILE *fin;
bool ret = true;
fin = fopen(filename, "rb");
if (fin == NULL)
{
_errno = E_NO_ENOUGH_BUFFER;
return false;
}
reset();
fseek(fin, 0, SEEK_END);
_datasize = ftell(fin);
_data = new BYTE[_datasize];
fseek(fin, 0, SEEK_SET);
size_t s = ftell(fin);
if (fread((char *)_data, 1, _datasize, fin) < _datasize)
{
reset();
ret = false;
goto final;
}
_fileheader = (BITMAPFILEHEADER *)_data;
if (_fileheader->bfType != 'MB')
{
reset();
ret = false;
goto final;
}
_info = (BITMAPINFOHEADER *)(_data+sizeof(BITMAPFILEHEADER));
_pal = (RGBQUAD *)(_data+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
_pixel = (_data+_fileheader->bfOffBits);
final:
fclose(fin);
return ret;
}
//------------------------------------------------------------
// 成员函数 bitmap::reset
// void bitmap::reset()
//
// 参数:
// 无.
// 返回值:
// 无.
// 备注:
// 这个成员函数用来将类成员变量的值设为初始值.
// 需要:
// 头文件: bitmap.h
// 源文件: bitmap.cpp
//------------------------------------------------------------
void bitmap::reset()
{
delete _data;
_fileheader = NULL;
_info = NULL;
_pal = NULL;
_pixel = NULL;
_data = NULL;
_datasize = 0;
_errno = E_NO_ERROR;
}
//------------------------------------------------------------
// 构造函数 bitmap::bitmap
// bitmap::bitmap()
//
// 参数:
// 无.
// 返回值:
// 无.
// 备注:
// 缺省的构造函数.
// 需要:
// 头文件: bitmap.h
// 源文件: bitmap.cpp
//------------------------------------------------------------
bitmap::bitmap()
{
_fileheader = NULL;
_info = NULL;
_pal = NULL;
_pixel = NULL;
_data = NULL;
_datasize = 0;
_errno = E_NO_ERROR;
}
//------------------------------------------------------------
// 析构函数 bitmap::~bitmap
// bitmap::~bitmap()
//
// 参数:
// 无.
// 返回值:
// 无.
// 备注:
//
// 需要:
// 头文件: bitmap.h
// 源文件: bitmap.cpp
//------------------------------------------------------------
bitmap::~bitmap()
{
reset();
}
#if defined _DBTEL
//------------------------------------------------------------
// 成员函数 bitmap::icon_size
// size_t bitmap::icon_size(ICON_TYPE icon_type)
//
// 参数:
// [in]icon_type: ICON的类型, 可能的取值: ICON_16BIT(16位的ICON),
// ICON_8BIT(8位的ICON).
// 返回值:
// ICON需要的缓冲区大小.
// 备注:
// 函数用来获取ICON所需要的缓冲区大小(包括ICON头), ICON的类型由
// icon_type指定.
// 需要:
// 头文件: bitmap.h
// 源文件: bitmap.cpp
//------------------------------------------------------------
size_t bitmap::icon_size(ICON_TYPE icon_type)
{
int shl;
switch (icon_type)
{
case ICON_8BIT:
shl = 0;
break;
case ICON_16BIT:
shl = 1;
break;
default:
return -1;
break;
}
return ((_info->biWidth*_info->biHeight)<<shl)+8;
}
//------------------------------------------------------------
// 成员函数 bitmap::bmp_to_icon
// bool bitmap::bmp_to_icon(BYTE *iconbuf, size_t len, ICON_TYPE icon_type)
//
// 参数:
// [out]iconbuf: 保存ICON的缓冲区.
// [in]len: 缓冲区的大小.
// [in]icon_type: ICON的类型, 可能的取值: ICON_16BIT(16位的ICON),
// ICON_8BIT(8位的ICON).
// 返回值:
// 如果成功, 返回true, 否则返回false.
// 备注:
// 函数用来转换BMP成ICON格式, ICON的类型由icon_type指定, 转换后的ICON保存
// 在iconbuf中.要想调用成功, icon_type必须是ICON_16BIT或ICON_8BIT, iconbuf
// 足够大, 并且BMP是24位格式.
// 需要:
// 头文件: bitmap.h
// 源文件: bitmap.cpp
//------------------------------------------------------------
bool bitmap::bmp_to_icon(BYTE *iconbuf, size_t len, ICON_TYPE icon_type)
{
size_t icon_len = icon_size(icon_type);;
_pixel_trans_func *pfunc_list = NULL;
_pixel_trans_func pfunc = NULL;
if (iconbuf == NULL || len < icon_len)
{
return false;
}
pfunc_list = _trans_func[icon_type];
//chenjun modify
iconbuf[0] = (_info->biWidth >> 8) & 0xff;
iconbuf[1] = (_info->biWidth) & 0xff;
iconbuf[2] = (_info->biHeight >> 8) & 0xff;
iconbuf[3] = (_info->biHeight) & 0xff;
iconbuf[4] = 0x00;
if (icon_type == ICON_8BIT)
{
iconbuf[5] = 0x08;
}
else if (icon_type == ICON_16BIT)
{
iconbuf[5] = 0x10;
}
else
{
_errno = E_ILLEGAL_ICON_TYPE;
return false;
}
iconbuf[6] = 0x00;
iconbuf[7] = 0x00;
switch(_info->biBitCount)
{
case 1:
break;
case 4:
break;
case 8:
break;
case 16:
break;
case 24:
pfunc = pfunc_list[BMP_24BIT];
break;
case 32:
break;
default:
break;
}
if (pfunc == NULL)
{
_errno = E_ONLY_BMP24;
return false;
}
LONG w;
LONG h;
size_t rowlen;
BYTE *picon = iconbuf+8;
BYTE *pbmp = _pixel;
//一个扫描行所占的字节数计算方法:
rowlen= (_info->biWidth * _info->biBitCount+31)/8;
// 一个扫描行所占的字节数
rowlen= (rowlen>>2)<<2; // 字节数必须是4的倍数
for (h=_info->biHeight-1; h>=0; h--)
{
pbmp = _pixel+rowlen*h;
for (w=0; w<_info->biWidth; w++)
{
(*pfunc)(picon, pbmp);
}
}
return true;
}
void bitmap::_pixel24to8(BYTE *&picon, BYTE *&pbmp)
{
*picon = rgb_to_clr8(pbmp[2], pbmp[1], pbmp[0]);
picon++;
pbmp+=3;
}
void bitmap::_pixel24to16(BYTE *&picon, BYTE *&pbmp)
{
WORD w = rgb_to_clr16(pbmp[2], pbmp[1], pbmp[0]);
picon[0] = w>>8;
picon[1] = w&0xff;
picon+=2;
pbmp+=3;
}
#endif // defined _DBTEL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -