#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main()
{
FILE* bmp = NULL;
uint32_t offset;
uint8_t* temp = NULL;
size_t read;
unsigned int x_dim = 600, y_dim = 388;
bmp = fopen("test_colour.bmp", "r");
if (!bmp)
return -1;
/* Get the image data offset */
fseek(bmp, 10, SEEK_SET);
fgets((char*)&offset, 4, bmp);
printf("Offset = %u\n", offset);
temp = malloc(3*x_dim*y_dim*sizeof(uint8_t));
if (!temp)
return -1;
/* Go the the position where the image data is stored */
fseek(bmp, offset, SEEK_SET);
/* Copy image data to array */
printf("%u bytes requested!\n", 3*x_dim*y_dim);
read = fread((void*)temp, sizeof(uint8_t), 3*x_dim*y_dim, bmp);
printf("%Iu bytes read!\n", read);
fclose(bmp);
free(temp);
return 0;
}
我正在使用上面的代码将每像素 24 位 BMP 图像的 RGB 数据读取到数组中。根据 BMP 规范,从图像数据开始(在 BMP 标头之后)的文件开头的偏移量在偏移量 10 处给出。执行上述代码时,我得到以下输出。
Offset = 54
698400 bytes requested!
33018 bytes read!
偏移量输出似乎是正确的,因为文件大小为 698454 字节(=698400+54)。但是,返回的值fread()
似乎表明无法读取整个图像数据。但是,我随后使用temp
数组中的数据将 RGB 数据转换为灰度数据并将此数据再次写入 BMP 文件。目视检查输出图像并不表示任何错误,即似乎我实际上首先阅读了整个输入图像,尽管fread()
似乎表明不同。
有人可以解释这种行为吗?