一.基本思路:
(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图片:
图片基本信息
测试结果:
数据基本一致,符合要求。