【问题标题】:image convolution from ppm file来自 ppm 文件的图像卷积
【发布时间】:2016-04-11 11:34:30
【问题描述】:

大家下午好。 首先,我想为我的代码道歉——我是一个真正的 C 初学者。我的问题是——我得到了 ppm 文件,我需要将那里的值存储到一个数组中。我已经存储了颜色的高度、宽度和最大值,现在我存储值的想法将如图所示 - 乘以三,因为它是 R G B 格式。 谢谢你的帮助,请考虑一下我是一个真正的 C 初学者。

my code and output

#include <stdio.h>
int main(int argc, char** argv) {
int i = 0;
int j = 0;
FILE *fp;
fp = fopen(argv[1], "r");
printf(" %s ", argv[1]);
printf("\n");
int firstLine[2];
int width;
int next;
int enter;
int loop;
int height;
int max_color;
int pix[width][height];
int mask[3][3] = {// inicializting our given mask
    {0, -1, 0},
    {-1, 5, -1},
    {0, -1, 0}
};

for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
        printf("%d ", mask[i][j]);

    }
    printf("\n");
}

fscanf(fp, "%s", &firstLine);
fscanf(fp, "%d", &height);
fscanf(fp, "%d", &width);
fscanf(fp, "%d", &max_color);


printf("%p", firstLine);
printf("\n");
printf("%d ", width);
printf("\n");
printf("%d", height);
printf("\n");
printf("%d", max_color);
printf("\n");


for (i = 0; i < width * 3; i++) {
    for (j = 0; j < height * 3; j++) {
        loop = fscanf(fp, "%d", &enter);
        pix[i][j] = enter;
        printf("%d ", enter);
    }
}

// fclose(fp);


return (EXIT_SUCCESS);

}

【问题讨论】:

  • 请勿使用图片分享代码! :) 请将其复制并粘贴到此处或粘贴到一个 pastebin。
  • 对不起,我是这里的初学者,所以我现在就这样做了。谢谢
  • 不确定您是否被告知要假设 8 位 R、G 和 B 样本,但从技术上讲,您应该在假设之前检查 MAX_INTENSITY 是否为 255,如果它超过 255(很可能等于 65535),您应该读取 16 位样本。
  • 我在下面添加了评论...

标签: c image convolution ppm


【解决方案1】:

您不能定义未知大小的数组,尤其是高度和宽度未初始化。您应该在这里使用动态分配的数组,如下所示:

int ***pix;
pix = malloc(height * sizeof(int**));
for (i = 0; i < height; i++) {
    pix[i] = malloc(width * sizeof(int**));
    for (j = 0; j < width; j++) {
        pix[i][j] = malloc(3 * sizeof(int));
    }
}

要正确解析二进制文件,您不能使用格式化输入,因为它们用于字符串。您可以改用 fread,例如读取宽度:

fread(&width, sizeof(int), 1, fp);

然后填充这个数组:

for (i = 0; i < height; i++) {
    for (j = 0; j < width; j++) {
        for (k = 0; k < 3; k++) {
            fread(&enter, sizeof(int), 1, fp);
            pix[i][j][k] = enter;
        }
    }
}

这只有在你所说的关于 ppm 文件的格式当然是正确的情况下才有效。

【讨论】:

  • 您好,非常感谢您的回答,非常感谢。不幸的是它不能很好地工作 - 给我 21755842 数组中的所有块。我们得到了一个二进制编码格式可移植像素图格式的输入 ppm 文件。这种格式总是: P6 ,宽度,高度,然后是常数 - 像素强度的最大值,然后是数据 - 每个像素的 RGB 部分。像素/RGB的每一部分是一个字节。
  • 文件是二进制的,所以格式化的输入肯定不行!
  • @fluter 表头其实是ASCII码,后面是二进制数据。
  • 是的,很抱歉没有具体说明,我试图了解 ppm 的工作原理以及它在任何地方都不是二进制的,如维基百科等。所以我很抱歉,但你至少能给我一个想法,然后你会如何保存它?我认为数组将是最好的选择,因为那时我将不得不在上面使用掩码......
  • 是的,当涉及到标题时,我有一个正确的输出,不幸的是我找不到如何存储其余部分的方法。
猜你喜欢
  • 2019-09-29
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2011-01-27
相关资源
最近更新 更多