2016-04-11 141 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,然後數據以二進制形式出現。 –