Судя по всему, вы читаете файл PPM .
Прочитайте заголовок, выполнив что-то вроде этого:
int width, height, max;
my_assert(3==fscanf(f_in, "P6%d%d%d ", &width, &height, &max));
/* TODO: error handling */
Спецификаторы формата говорят ему прочитать ожидаемое магическое число ("P6"), затем второе, третье и четвертое слова как целые числа (неявно пропуская любые пробелы между ними), а затем использовать пробел ("в основном, символ новой строки" согласно PPM). ), чтобы установить позицию чтения файла туда, где начинаются двоичные данные. Вы, вероятно, должны убедиться, что width / height / max находятся в пределах того, что ожидает ваше приложение, и может с этим справиться.
А затем прочитайте оставшиеся данные в память. fread
чтение из текущей позиции чтения size*count
байт; без форматирования:
int channel_width = max < 256 ? 1 : 2; /* PPM channel width can be either 1- or 2-byte */
int rgb = 3;
int imgsize = width*height*rgb*channel_width;
void* texture = malloc(imgsize);
my_assert(imgsize==fread(texture, 1, imgsize, f_in));
/* do something with the texture memory */
В этот момент вы можете просто привести указатель текстуры к любой структуре, которую вы хотите использовать, например, pixel1D* pixs = texture
(просто будьте осторожны, если каналы имеют длину 2 байта, так как ваша опубликованная структура - нет). Я считаю, что структура, несущая мета и блок памяти без типов, более гибкая, поскольку в основном работает с OpenGL. Возможно, именно это вы и хотели сделать с типом Image
.
Код полностью не проверен. Получайте удовольствие отлаживая его.