将大小为 N 的一维二进制数组写入 (N/2, N/2) 大小的 PPM 图像

Writing a 1D binary array of size N to a (N/2, N/2) size PPM image

我有以下代码 '''

#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);
}

但这只是生成一张空白图像。我不确定问题出在哪里。

您的代码存在几个问题。类型 P6 NetPBM 每个像素使用 3 个字节(红色、绿色、蓝色各一个字节)。您大概正在写一个 32×32 的图像,因此您需要的值是现有值的 3 倍(好吧,除非 ints 的使用是有意的,在这种情况下您有 太多 值——我们会回到那个)。我假设您确实需要灰度图像,因此我们将切换到 type P5 图像。此外,您正在编写 ints,它们大概有 4 或 8 个字节长。这是故意的吗?最后,sizeof(img) 为您提供 img 类型的大小,即 pointer-to-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;
}