BMP图片格式的使用

BMP图片格式的使用

介绍

BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

整体信息

BMP格式的文件从头到尾依次是如下信息:

  • bmp文件头(bmp file header):共14字节;
  • 位图信息头(bitmap information):共40字节;
  • 调色板(color palette):可选;
  • 位图数据;

代码展示

typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;

#pragma pack(1)   			// 取消字节对齐 
typedef struct
{			// bmp图片文件头信息封装 
	// 位图文件头 
	u8  bit_file_type[2];	// 位图文件类型:'BM'->0x4d42 
	u32 file_size;	  		// 整个文件大小 
	u16 reserved1;	  		// 保留 
	u16 reserved2;	  		// 保留 
	u32 offset;		  		// 文件头到位图数据之间的偏移量 

	// 位图信息头 
	u32 head_size;			// 位图信息头长度 
	u32 width;		  		// 位图宽度 
	u32 height;		  		// 位图高度 
	u16 bit_planes;	  		// 位图位面数 
	u16 bits_per_pixel; 	// 每个像素的位数 
	u32 compression;		// 压缩说明 
	u32 image_size;			// 位图数据大小 
	u32 h_res;				// 水平分辨率 
	u32 v_res;				// 垂直分辨率 
	u32 color_palette;		// 位图使用的颜色索引数 
	u32 vip_color;			// 重要的颜色索引数目 

} bmp_head;
#pragma pack() 	// 恢复字节对齐*/
/******************************************
*函数名:void Desplay_picture(char *bmp_route, char *map_ptr, int x, int y)
*说明:打开一张图片,并显示到lcd屏幕上
*参数1:图片路径    ->bmp_route
*参数2:映射地址    ->map_ptr
*参数3:起始位置    ->(x,y)
*返回值:无
******************************************/

void Desplay_picture(char *bmp_route, char *map_ptr, int x, int y)
{
	// 打开图片文件
	int bmp_fd = open(bmp_route, O_RDONLY);
	if(bmp_fd == -1)
	{
		printf("打开\033[36;1m %s \033[0m失败! \n", bmp_route);
		exit(-1);       // 打开失败,则退出系统
	}
	
	// 读取图片头部信息
	bmp_head bmp_head_letter;	
	read(bmp_fd, &bmp_head_letter, sizeof(bmp_head));
	
	// 申请缓存区, 用于存储图片RGB
	char bmp_buf[bmp_head_letter.width * bmp_head_letter.height * 3];

	//清空这块缓存空间
	bzero(bmp_buf,sizeof(bmp_head_letter.width * bmp_head_letter.height * 3));
	
	// 读取图片数据
	read(bmp_fd, bmp_buf, sizeof(bmp_buf));
	
	// 关闭图片文件
	close(bmp_fd);
	
	// 将数据存入映射内存
	// LCD显示该图片
	int i,j;
	for(i=0; i<bmp_head_letter.height; i++)//
	{
		for(j=0; j<bmp_head_letter.width; j++)//
		{
			*(map_ptr +((i + y) *800 +j +x) *4 +0) = bmp_buf[((bmp_head_letter.height -1 -i) *bmp_head_letter.width +j) *3 +0];
			*(map_ptr +((i + y) *800 +j +x) *4 +1) = bmp_buf[((bmp_head_letter.height -1 -i) *bmp_head_letter.width +j) *3 +1];
			*(map_ptr +((i + y) *800 +j +x) *4 +2) = bmp_buf[((bmp_head_letter.height -1 -i) *bmp_head_letter.width +j) *3 +2];
			*(map_ptr +((i + y) *800 +j +x) *4 +3) = 0x00; //<<24;
		}
	}
}

你可能感兴趣的:(linux)