C语言BMP图片显示函数:show_bmp() - 代码解析及优化
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);
}
代码解析
-
函数参数:
pathname: BMP图片文件路径x_begin: 图片在显示区域的起始横坐标y_begin: 图片在显示区域的起始纵坐标
-
文件打开:
- 使用
fopen函数打开BMP图片文件,并进行错误处理。如果打开失败,打印错误信息并返回。
- 使用
-
读取文件头:
- 使用
fread函数读取BMP文件头信息,并将信息存储在bmphead_buf结构体中。
- 使用
-
获取图片信息:
- 从
bmphead_buf结构体中获取图片宽度、高度和位数。
- 从
-
分配内存:
- 使用
malloc函数分配内存,用于存储BMP图片数据。 - 在分配内存后,检查分配是否成功。如果分配失败,打印错误信息、关闭文件并返回。
- 使用
-
读取图片数据:
- 使用
fread函数读取BMP图片数据,并存储到分配的内存中。 - 由于BMP文件可能进行字节对齐,因此需要使用
fseek函数跳过补齐的字节。
- 使用
-
将RGB数据转换为ARGB数据:
- 分配内存,用于存储ARGB数据。
- 使用循环将读取的RGB数据转换为ARGB数据。
-
显示图片:
- 使用循环将ARGB数据写入显示区域。
-
资源释放:
- 使用
fclose函数关闭文件。 - 使用
free函数释放分配的内存。
- 使用
代码优化
-
内存分配错误处理:在分配内存后,检查分配是否成功。如果分配失败,打印错误信息、关闭文件并返回。
-
文件打开错误处理:在打开文件后,检查文件是否成功打开。如果打开失败,打印错误信息并返回。
其他说明
- 该代码使用了
lcdinfo和lcdmen两个全局变量,分别代表LCD显示屏信息和内存地址,具体实现取决于硬件平台。 - 该代码使用了
bmphead结构体,用于存储BMP文件头信息,具体定义取决于使用的BMP文件格式。 - 该代码仅提供了一个简单的BMP图片显示示例,实际使用时可能需要根据具体情况进行修改和完善。
总结
本文详细解析了C语言中用于显示BMP图片的函数show_bmp(),并针对代码中可能出现的段错误进行了优化,包括内存分配错误处理和文件打开错误处理。该代码提供了一个简单的BMP图片显示示例,实际使用时可能需要根据具体情况进行修改和完善。
希望本文能够帮助您理解和使用C语言进行BMP图片显示。
原文地址: https://www.cveoy.top/t/topic/qsra 著作权归作者所有。请勿转载和采集!