#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()
表示が異なるように見えますが、最初に入力画像全体を実際に読み取ったように見えます。
誰かがこの行動を説明できますか?