Понимание fread () для хранения значений пикселей rgb - PullRequest
0 голосов
/ 07 мая 2018

Я полагаю, что цикл for следует заменить на fread, однако мне очень непонятно, как будет работать fread.

Как fread узнает значение зеленого пикселя @ в заданном месте и где сохранить значение. Насколько я понимаю, у меня есть кусок кучи памяти, прямоугольник имеет количество пикселей в ТБД. Каждый пиксель имеет 3 значения. Как будет fread (или любой другой метод, который я могу использовать)?

Если бы кто-нибудь мог просто объяснить, как строка кода ниже будет работать с моим кодом? Это для задания, я просто пытаюсь понять, что происходит, потому что это тот, на котором мы будем строить.

fread(pixelD, sizeof(Pixel), width*height, file);

typdef struct
{       
        unsigned char green;
        unsigned char blue;
        unsigned char red;
}pixelD;

typedef struct
{       
        pixelD * pixel;
} Color;

Image * ReadImage(char *filename)
{
  int width, height, maxval;
  int imgSize = width * height * sizeof(pixel); 

  //fscanf line was given by prof 
  fscanf(f_in, "%s\n%d %d\n%d\n", magicNum, &width, &height, &maxval);
  pixel = malloc(imgSize);                       
  for(int i = 0; i <imgSize; i++)
  {
     pixel.green = pixel[i];  ???? 
     pixel.blue = ; 
     pixel.red = ; 
  }
}

1 Ответ

0 голосов
/ 07 мая 2018

Судя по всему, вы читаете файл 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.

Код полностью не проверен. Получайте удовольствие отлаживая его.

...