在文件元数据的固定位置,有三个重要的整数,每个存储的使用正好是4个字节:
在字节偏移10-13中,在像素阵列开始位图文件中的偏移。
在字节偏移18-21,图像的宽度,以像素为单位。
在字节偏移22-25中,图像的高度,以像素为单位。
/*
* Read in the location of the pixel array, the image width, and the image
* height in the given bitmap file.
*/
void read_bitmap_metadata(FILE *image, int *pixel_array_offset, int *width, int *height) {
fseek(image, 10, SEEK_SET);
fread(pixel_array_offset, 4, 1, image);
fseek(image, 18, SEEK_SET);
fread(width, 4, 1, image);
fseek(image, 22, SEEK_SET);
fread(height, 4, 1, image);
}
我一定要在这里使用fseek
3次,连注意到,宽度和高度都不断?
不,你可以省略最后fseek()
。
所述fread()
通过数据的读出的量总是前移文件位置。所以,你只需要fseek()
当你想跳过一些字节,或当你想寻求一个固定的位置,你不关心您当前所在。
既然你只跳过几个字节,你可能也只是做从偏移0 26字节的单fread()
到缓冲区中,然后从缓冲挑选数据,你需要它。
字节序的警告:有是从文件中读取多字节整数当一个大问题:这是否工作或不依赖于文件的字节序和主机字节序。您的代码只有当它们匹配的作品。如果他们不匹配你有fread()
手术后交换字节。在Linux上你有bswap_32()
这一点,或者如果该文件中的字节顺序是大端(又名网络字节顺序),你可以使用ntohl()
。
如果您使用的是最新的操作系统(即具有虚拟内存),那么你可以使用mmap
,将文件映射到内存中(不复制,它使用的虚拟内存)。这将允许你读/(任选地写),并寻求使用的存储器操作:在C.指针运算/阵列,
对于Unix系统(GNU / Linux的,MacOS的,BSD,系统V),参见https://en.wikipedia.org/wiki/Mmap和http://man7.org/linux/man-pages/man2/mmap.2.html
我认为,即使微软的Windows现在可以做到这一点,看到https://docs.microsoft.com/en-gb/windows/desktop/Memory/file-mapping