2016-04-11 67 views
0

大家下午好。首先,我想为我的代码道歉 - 我是一个真正的C初学者。我的问题是 - 我给了ppm文件,我需要将值从那里存储到数组中。我已经存储了颜色的高度,宽度和最大值,现在我的想法是存储一个值,如图所示 - 乘以三是因为它是R G B格式。 感谢您的帮助和购买海外商品会有其实我在C.一个真正的初学者来自ppm文件的图像卷积

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

}

+0

请不要使用图片分享代码! :)请复制并粘贴在这里或一个pastebin。 – fluter

+0

对不起,我是初学者,所以我现在就做。谢谢 – user118331

+0

不知道是否被告知假设8位R,G和B采样,但从技术上讲,在假设之前你应该检查'MAX_INTENSITY'是255,如果超过255(最可能等于65535),你应该读取16位样本。 –

回答

1

不能与未知大小,ESP高度和宽度定义数组不初始化。这里,应该使用动态分配的数组,像这样:

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文件的格式是正确的,当然。

+0

嗨,非常感谢您的回答,我真的很感激。 不幸的是,它不能很好地工作 - 给我21755842所有的数组块。我们获得了二进制编码格式的可移植像素格式的输入ppm文件。这种格式总是:P6,宽度,高度,然后是常量 - 像素的最大强度值 ,然后是数据 - 每个像素的RGB部分。像素/ RGB的每个部分都是一个字节。 – user118331

+0

该文件是二进制文件,因此格式化的输入肯定无法使用! – fluter

+0

@fluter头部实际上是ASCII,然后数据以二进制形式出现。 –