编写程序来获取一个bmp图片信息

一.基本思路:

(1)了解bmp图片的基本格式:

 (2)打开bmp图片:

对于如何在程序中打开bmp图片,我们可以利用open函数来对bmp图片进行打开操作。

首先我们先了解下open函数的基本参数(我这里只举一个,至于另一个,大家可以通过man对open函数进行查询)。

int open(const char *pathname, int flags);

pathname:指定要打开或创建的文件名,带路径(如果不带路径,表示在当前路径)。

flags:打开文件的标志(用位域来实现)。

标志如:

                    O_RDONLY     只读
                    O_WRONLY    只写
                    O_RDWR        读写

(3)读取bmp图片的数据: 

对于读取操作,我们可以通过read函数来实现。

首先来了解下它的一些基本参数。

ssize_t read(int fd, void *buf, size_t count); 

fd:文件描述符,表示你要从哪个文件中读取(open函数的返回值)。
buf:void * 通用指针,指针指向一段内存的首地址,用来保存所读取到的数据。
count:字节数,表示你要读取多少个字节的数据。

(4)对所读取的数据进行判断或输出: 

例如bmp图片的魔数是BM,我们可以根据魔数先对你所要查询的文件进行判断,若是bmp文件则进行下一步操作,若不是则直接返回。

(5)移位操作:

每当我们读取完数据后,我们可以通过移动光标(文件偏移量)来读取后面有用的数据信息。

函数为lseek函数。其基本参数为:

off_t lseek(int fd, off_t offset, int whence);

fd:文件描述符,表示你要定位光标的那个文件
offset:文件偏移量 
whence:定位方式
                        SEEK_SET    基于文件开头位置定位
                                新光标的位置 = 文件开头 + offset (>=0)
                        
                        SEEK_CUR    基于当前光标所在的位置
                                新光标的位置 = 当前位置 + offset (可正可负)
                        
                        SEEK_END    基于文件末尾位置定位
                                新光标的位置 = 末尾位置 + offset (可正可负)

二.程序代码:

#include<stdio.h>
#include<string.h>
#include <sys/types.h>		
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
	int fd,i=0;
	char buf[10]={0};
	int bur[10]={0};
	short bul[10]={0};
	fd=open(argv[1],O_RDWR);
	if(fd==-1)
		printf("没有文件!\n");

	read(fd,buf,2);

	if(buf[0]=='B')
	{
		if(buf[1]=='M')
		{
			printf("是bmp文件\n");
			read(fd,bur+i,4);
			printf("字节大小为%d个字节\n",bur[i++]);
			lseek(fd,12,SEEK_CUR);
			read(fd,bur+i,4);
			printf("该图片的宽为%d\n",bur[i++]);
			read(fd,bur+i,4);
			printf("该图片的高为%d\n",bur[i++]);	
			lseek(fd,2,SEEK_CUR);
			read(fd,bul,2);
			printf("位深度为%hd\n",bul[0]);	
		}
		else
			printf("不是bmp文件\n");
	}
	else
		printf("不是bmp文件\n");

	close(fd);

	return 0;
	
}

三.结果:

(1)测试一个bmp图片:

图片基本信息

 

测试结果:

数据基本一致,符合要求。

(2)测试一个非bmp文件:

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序番茄君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值