Запись одномерного двоичного массива размера N в изображение PPM размером (N / 2, N / 2) - PullRequest
1 голос
/ 03 августа 2020

У меня есть следующий код '' '

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void main()
{
    int n = 32;
    int* img = malloc(sizeof(int)*n*n);
    for(int i = 0; i < n*n; i++) { 
        if(i%n < n/2) { 
            img[i] =   0;
        }
        else { 
            img[i] = 255;
        }
    }
    FILE *fp = fopen("img.ppm", "wb"); /* b - binary mode */
    fprintf(fp, "P6\n%d %d\n255\n", n, n);
    fwrite(img, sizeof(img), 1, fp);
    fclose(fp);
    free(img);
}

Но это просто генерирует пустое изображение. Я не уверен, в чем проблема.

1 Ответ

2 голосов
/ 03 августа 2020

Есть несколько проблем с вашим кодом. NetPBM типа P6 использует 3 байта для каждого пикселя (по одному байту для красного, зеленого, синего). Предположительно вы пишете изображение размером 32 × 32, поэтому вам потребуется в 3 раза больше значений, чем то, что у вас есть (ну, если использование int s не было намеренным, и в этом случае у вас слишком много значений - мы вернемся к этому). Я предполагаю, что вам действительно нужно изображение в оттенках серого, поэтому мы переключимся на изображение типа P5 . Кроме того, вы пишете int s, и они предположительно имеют длину 4 или 8 байтов. Это было намеренно? Наконец, sizeof(img) дает вам размер типа img, который является указателем на int, то есть 4 или 8 байтов в зависимости от вашей системы. Это не размер вашего массива.

Вот предложение:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h> // I'll use uint8_t for the pixel bytes. That's personal preference, you can also stick with chars if you want.

int main() // Not relevant, but main should return int
{
    int n = 32;
    uint8_t * img = malloc(n*n); // Each pixel is a byte, an 8-bit unsigned integer.
    for(int i = 0; i < n*n; i++) { 
        if(i%n < n/2) { 
            img[i] =   0;
        }
        else { 
            img[i] = 255;
        }
    }
    FILE *fp = fopen("img.ppm", "wb");
    fprintf(fp, "P5\n%d %d\n255\n", n, n); // P5 mode for grayscale, since you don't specify in your question what you want to do with colors.
    fwrite(img, 1, n*n, fp); // n*n pixel values, each 1 byte long.
    fclose(fp);
    free(img);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...