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

📄 bitmap.h

📁 把BMP图片转换成手机中ICON的数据,支持8位和16位代码格式
💻 H
字号:

#if !defined _BITMAP_H
#define _BITMAP_H
#if !defined _WINDOWS
#define _WINDOWS
#endif
#include <stdio.h>



#if !defined _WINDOWS

#pragma pack(push, _bmp_struct, 2 )

typedef unsigned char	BYTE;
typedef unsigned short	WORD;
typedef unsigned long	DWORD;
typedef long			LONG;

typedef struct tagBITMAPFILEHEADER
{
	WORD	bfType;			// 位图文件的类型,必须为BM
	DWORD   bfSize;			// 位图文件的大小,以字节为单位
	WORD	bfReserved1;	// 位图文件保留字,必须为0
	WORD	bfReserved2;	// 位图文件保留字,必须为0
	DWORD   bfOffBits;		// 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;			// 14 byte


typedef struct tagBITMAPINFOHEADER
{
	DWORD  biSize;			// 本结构所占用字节数
	LONG	biWidth;		// 位图的宽度,以像素为单位
	LONG	biHeight;		// 位图的高度,以像素为单位
	WORD	biPlanes;		// 目标设备的级别,必须为1
	WORD	biBitCount;		// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
	DWORD	biCompression;	// 位图压缩类型,必须是 0(不压缩), 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
	DWORD	biSizeImage;	// 位图的大小,以字节为单位
	LONG	biXPelsPerMeter;// 位图水平分辨率,每米像素数
	LONG	biYPelsPerMeter;// 位图垂直分辨率,每米像素数
	DWORD  biClrUsed;		// 位图实际使用的颜色表中的颜色数
	DWORD  biClrImportant;	// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;			// 40 byte

typedef struct tagRGBQUAD 
{
	BYTE	rgbBlue;	// 蓝色的亮度(值范围为0-255)
	BYTE	rgbGreen;	// 绿色的亮度(值范围为0-255)
	BYTE	rgbRed;		// 红色的亮度(值范围为0-255)
	BYTE	rgbReserved;// 保留,必须为0
} RGBQUAD;

#pragma pack(pop, _bmp_struct)
#else // !defined _WINDOWS
#include <windows.h>
#endif // !defined _WINDOWS


//==================================================================
//	类 bitmap
//	class bitmap  
//
//	备注:
//		bitmap类封装了对bmp文件的操作。
//	需要:
//		头文件: bitmap.h
//		源文件: bitmap.cpp
//==================================================================
class bitmap
{
public:

	//错误信息ID
	enum ERROR_TYPE {E_NO_ERROR, E_ILLEGAL_ICON_TYPE, E_NO_ENOUGH_BUFFER, E_ONLY_BMP24};
	//返回错误信息
	const char *error_msg();
	//将类成员变量的值设为初始值
	void reset();

	#if defined _DBTEL
	//{
	//ICON类型ID
	enum ICON_TYPE {ICON_8BIT, ICON_16BIT, ICON_TYPE_SIZE};
	//返回ICON需要的缓冲区大小
	size_t icon_size(ICON_TYPE icon_type);
	//转换成ICON格式
	bool bmp_to_icon(BYTE *iconbuf, size_t len, ICON_TYPE icon_type =ICON_8BIT);
	//}
	#endif // defined _DBTEL
	
	//读BMP文件
	bool load_file(const char *filename);
	//构造函数
	bitmap();
	//析构函数
	~bitmap();

protected:

	#if defined _DBTEL
	//{
	//BMP文件的类型ID
	enum BMP_TYPE {BMP_1BIT, BMP_4BIT, BMP_8BIT, BMP_16BIT, BMP_24BIT, BMP_32BIT, BMP_TYPE_SIZE};
	//定义转换函数类型
	typedef void (*_pixel_trans_func)(BYTE *&picon, BYTE *&pbmp);
	//转换函数数组
	static _pixel_trans_func _trans_func[ICON_TYPE_SIZE][BMP_TYPE_SIZE];
	//转换函数
	static void _pixel24to8(BYTE *&picon, BYTE *&pbmp);
	static void _pixel24to16(BYTE *&picon, BYTE *&pbmp);
	//}
	#endif // defined _DBTEL

protected:

	//错误信息数组
	static const char *_errmsg[];
	//保存错误信息ID
	int _errno;

	//BMP文件头指针
	BITMAPFILEHEADER *_fileheader;
	//BMP文件信息指针
	BITMAPINFOHEADER *_info;
	//调色板信息指针
	RGBQUAD *_pal;
	//象素信息指针
	BYTE *_pixel;
	//整个BMP文件的缓冲区
	BYTE *_data;
	//整个BMP文件缓冲区的大小
	DWORD _datasize;
};
#endif // !defined _BITMAP_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -