Как прочитать пиксели изображения в c? - PullRequest
0 голосов
/ 09 февраля 2019

Предположим, что наше растровое изображение имеет высоту M и ширину N. В этой лабораторной работе мы всегда будем предполагать, что ширина N кратна 4, что упрощает разметку байтов в файле.Для этого изображения массив пикселей хранит ровно 3 x N x M байтов следующим образом:

Каждая группа из 3 байтов представляет один пиксель, где байты хранят значения синего, зеленого и красного цветов.пикселя в указанном порядке.

Пиксели сгруппированы по строкам.Например, первые 3 x N байтов в массиве пикселей представляют пиксели в самой верхней строке изображения.

pixel_array_offset - это то место, где начинается массив пикселей.

Структурный пиксель задается следующим образом:

struct pixel {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
};

И вот требование для реализации функции:

/*
 * Read in pixel array by following these instructions:
 *
 * 1. First, allocate space for m "struct pixel *" values, where m is the
 *    height of the image.  Each pointer will eventually point to one row of
 *    pixel data.
 * 2. For each pointer you just allocated, initialize it to point to
 *    heap-allocated space for an entire row of pixel data.
 * 3. ...
 * 4. ...
 */
struct pixel **read_pixel_array(FILE *image, int pixel_array_offset, int width, int height) {

}

Для первого шага выделите место для m "struct pixel *" ценности.Я думаю, что на самом деле это место для массива значений пикселей.Поэтому я ставлю

unsigned char **ptrs = height * malloc(sizeof(struct pixel));

Для второго шага я не совсем понимаю, что мне делать.Я думаю, что мне нужен цикл for, чтобы выделить место для всех строк данных пикселей.Но я понятия не имею, что мне следует положить внутрь.

for (int i=0, i<height, i++) {

        }

1 Ответ

0 голосов
/ 09 февраля 2019

Так как вы хотите выделить двумерный массив, вам сначала нужно выделить массив struct pixel *:

struct pixel **ptrs = malloc(height * sizeof(struct pixel*));

Здесь есть несколько изменений, на которые следует обратить внимание:

  1. Вы назначаете указатели на struct pixel, а не unsigned char.
  2. malloc() возвращает указатель.Умножение указателя на целое число недопустимо.
  3. Умножение идет в скобках, поскольку оно помогает вычислить правильное количество байтов для распределения.

Далее необходимо выделить массив изstruct pixel для каждой строки в массиве 2D:

for (int i=0, i<height, i++) {
    ptrs[i] = malloc(width * sizeof(struct pixel));
}

Теперь массив полностью выделен, и вы можете заполнить его данными:

ptrs[5][6] = { 255, 0, 0}; // a blue pixel

Наконец, не забудьте free()все ваши указатели перед выходом из программы:

for (int i=0, i<height, i++) {
    free(ptrs[i]);
}

free(ptrs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...