c-将大小为N的1D二进制数组写入(N/2,N/2)大小的PPM图像



我有以下代码''

#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, "P6n%d %dn255n", n, n);
fwrite(img, sizeof(img), 1, fp);
fclose(fp);
free(img);
}

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

您的代码有几个问题。P6型NetPBM为每个像素使用3个字节(红、绿、蓝各一个字节(。您可能正在编写一个32×32的图像,因此您需要的值是现有值的3倍(好吧,除非ints的使用是有意的,在这种情况下,您有太多值,我们将回到这一点(。我假设您实际上想要一个灰度图像,所以我们将切换到类型P5的图像。此外,您正在编写ints,它们大概有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, "P5n%d %dn255n", 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;
}

相关内容

  • 没有找到相关文章

最新更新