#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;
}
Я использую приведенный выше код для чтения данных RGB 24 -бит на пиксель BMP-изображения в массив. Смещение от начала файла, где данные изображения начинаются (после заголовка BMP ), указывается по смещению 10 в соответствии со спецификацией BMP. Я получаю следующий вывод при выполнении приведенного выше кода.
Offset = 54
698400 bytes requested!
33018 bytes read!
Вывод смещения кажется правильным, поскольку размер файла составляет 698454 байта (= 698400+54 ). Однако значение, возвращаемое fread()
, по-видимому, указывает на то, что не все данные изображения могут быть прочитаны. Однако впоследствии я использую данные из массива temp
для преобразования данных RGB в оттенки серого и снова записываю эти данные в файл BMP. Визуальная проверка выходного изображения не указывает на какие-либо ошибки, т. е. кажется, что я действительно прочитал все входное изображение в первую очередь, хотя fread()
, похоже, указывает на другое.
Может кто-нибудь объяснить такое поведение?