将大小为 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 倍(好吧,除非 int
s 的使用是有意的,在这种情况下您有 太多 值——我们会回到那个)。我假设您确实需要灰度图像,因此我们将切换到 type P5 图像。此外,您正在编写 int
s,它们大概有 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;
}
我有以下代码 '''
#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 倍(好吧,除非 int
s 的使用是有意的,在这种情况下您有 太多 值——我们会回到那个)。我假设您确实需要灰度图像,因此我们将切换到 type P5 图像。此外,您正在编写 int
s,它们大概有 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;
}