C语言BMP图片显示函数:show_bmp() - 代码解析及优化

本文将解析一个C语言函数show_bmp,该函数用于显示BMP图片。代码如下:

void show_bmp(char * pathname,int x_begin,int y_begin)
{
	int bmp_width;	//图片的宽
	int bmp_high;	//图片的高
	int bmp_bit;	//图片的位数
	
	int i = 0;		//用于循环
	
	FILE *fp = fopen(pathname,'r');
	if(fp == NULL)
	{
		//失败原因:1.开发板里面没有上传图片,
		//			2.路径名写错了
		//			3.格式不对
		printf('fopen %s failed\n',pathname);
		return ;
	}
	printf('fopen %s success\n',pathname);
	
	struct bmphead bmphead_buf;
	fread(&bmphead_buf,54,1,fp);
	
	printf('图片宽度 = %d\n',bmphead_buf.Width);
	printf('图片高度 = %d\n',bmphead_buf.Height);
	printf('图片位数 = %d\n',bmphead_buf.biBitCount);
	
	//将图片数据从结构体重新赋值
	bmp_width = bmphead_buf.Width;
	bmp_high  = bmphead_buf.Height;
	bmp_bit   = bmphead_buf.biBitCount;

	//设置bmp图片的颜色缓冲区   800*480*3
	char *bmpbuf = malloc(bmp_width*bmp_high*bmp_bit/8);
	if(bmpbuf == NULL)
	{
		perror('malloc bmpbuf failed');
		fclose(fp); // 需要关闭文件
		return ;
	}
	

	//先计算有没有进行4字节补齐,如果要补,求补了几个字节  add_size
	int add_size = (4-(bmp_width*bmp_bit/8)%4)%4;
	
	for(i = 0;i<bmp_high;i++)
	{
		fread(bmpbuf+(bmp_width*bmp_bit/8)*i,bmp_width*bmp_bit/8,1,fp);
		fseek(fp,add_size,SEEK_CUR);
	}

	
	//以字节对齐的方式,将RGB数据转换成ARGB数据
	int *bmpARGB = malloc(bmp_width*bmp_high*4);
	if(bmpARGB == NULL)
	{
		perror('malloc bmpARGB failed');
		return ;
	}
	printf('asd\n');
	//利用循环 将RGB数据转换成ARGB数据
	for(i= 0;i<bmp_width*bmp_high;i++)
	{
		bmpARGB[i] = bmpbuf[0+i*3] | bmpbuf[1+i*3] <<8 | bmpbuf[2+i*3] <<16;
	}
	int x,y;
	for(x = 0;x+x_begin < lcdinfo->width && x<bmp_width ; x++)
	{
		for(y = 0;y+y_begin < lcdinfo->high && y<bmp_high ; y++)
		{
					
				int lcd_offset = x+x_begin + (y+y_begin)*lcdinfo->width;
				int bmp_offset = x + (bmp_high-y-1)*bmp_width;

				*(lcdmen +lcd_offset ) = bmpARGB[bmp_offset];
			}
	}
	printf('asd\n');
	
	//关闭图片
	fclose(fp);
	//释放堆空间
	free(bmpARGB);
	free(bmpbuf);
	
}

代码解析

  1. 函数参数:

    • pathname: BMP图片文件路径
    • x_begin: 图片在显示区域的起始横坐标
    • y_begin: 图片在显示区域的起始纵坐标
  2. 文件打开:

    • 使用fopen函数打开BMP图片文件,并进行错误处理。如果打开失败,打印错误信息并返回。
  3. 读取文件头:

    • 使用fread函数读取BMP文件头信息,并将信息存储在bmphead_buf结构体中。
  4. 获取图片信息:

    • bmphead_buf结构体中获取图片宽度、高度和位数。
  5. 分配内存:

    • 使用malloc函数分配内存,用于存储BMP图片数据。
    • 在分配内存后,检查分配是否成功。如果分配失败,打印错误信息、关闭文件并返回。
  6. 读取图片数据:

    • 使用fread函数读取BMP图片数据,并存储到分配的内存中。
    • 由于BMP文件可能进行字节对齐,因此需要使用fseek函数跳过补齐的字节。
  7. 将RGB数据转换为ARGB数据:

    • 分配内存,用于存储ARGB数据。
    • 使用循环将读取的RGB数据转换为ARGB数据。
  8. 显示图片:

    • 使用循环将ARGB数据写入显示区域。
  9. 资源释放:

    • 使用fclose函数关闭文件。
    • 使用free函数释放分配的内存。

代码优化

  1. 内存分配错误处理:在分配内存后,检查分配是否成功。如果分配失败,打印错误信息、关闭文件并返回。

  2. 文件打开错误处理:在打开文件后,检查文件是否成功打开。如果打开失败,打印错误信息并返回。

其他说明

  • 该代码使用了lcdinfolcdmen两个全局变量,分别代表LCD显示屏信息和内存地址,具体实现取决于硬件平台。
  • 该代码使用了bmphead结构体,用于存储BMP文件头信息,具体定义取决于使用的BMP文件格式。
  • 该代码仅提供了一个简单的BMP图片显示示例,实际使用时可能需要根据具体情况进行修改和完善。

总结

本文详细解析了C语言中用于显示BMP图片的函数show_bmp(),并针对代码中可能出现的段错误进行了优化,包括内存分配错误处理和文件打开错误处理。该代码提供了一个简单的BMP图片显示示例,实际使用时可能需要根据具体情况进行修改和完善。

希望本文能够帮助您理解和使用C语言进行BMP图片显示。

C语言BMP图片显示函数:show_bmp() - 代码解析及优化

原文地址: https://www.cveoy.top/t/topic/qsra 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录