Есть несколько проблем с вашим кодом. 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;
}