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

📄 bitmap.cpp

📁 把BMP图片转换成手机中ICON的数据,支持8位和16位代码格式
💻 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 + -