2012-02-27 89 views
0

我想在C程序中編寫一個PGM文件,但一旦寫入,如果我嘗試打開它來查看圖像,我被告知圖像文件格式可以'不確定。在C中編寫PGM文件不起作用

但是,如果我在geany中創建一個新文件,複製數據,然後保存THAT作爲一個新的PGM,它的工作原理。

任何想法,爲什麼這可能是?

FILE * grey = fopen("greyscale.pgm", "w"); 

fprintf(grey, "P2 \r\n%d %d \r\n255 \r\n", width, height); 

for (i = 0; i < width; i++) { 
    for (j = 0; j < height; j++) { 
     fprintf(grey, "%d ", ((imageArray[i][j].red + imageArray[i][j].green + imageArray[i][j].blue)/3)); 
    } 
    fprintf(grey, "\r\n"); 
} 

我將彩色圖像轉換爲灰度。

+0

這可能與您的PGM文件的標題可以添加一個創建PGM文件的代碼段 – pQB 2012-02-27 16:42:14

+0

我將它有關 – Luke 2012-02-27 17:32:33

+1

?。當你將RGB轉換成灰色時,1/3不是一個好的係數,試試'0.299R + 0.587G + 0.114B'這是一個普遍的公式 – Benoit 2012-02-28 09:05:35

回答

1

我認爲你不應該使用\r\n作爲行分隔符,但只有\n。另外,請檢查沒有行長度超過70個字符。由於每個像素最多需要4個字符(3加上空格),因此在每17個像素之後插入\n。 你可以用註釋分隔實線(例如:

pixel11 pixel12 pixel13 
pixel14 pixel15 
# switch to next row 
pixel21 pixel22 pixel23 
pixel24 pixel25 
# etc. 
+0

謝謝。我設法讓它工作。我認爲這是頭文件中的空白或其後的問題。 – Luke 2012-02-29 11:19:03

1

看着你的代碼,我看到你插入一個new line每元素。與PGM的文件格式,根據,報頭後,如下

  • 光柵高度行,,以便從頂部到底部。每行由寬度灰度值組成,按從左到右的順序排列。

但是你正在寫一排高度元素。所以,你可能以錯誤的方式訪問數據。實際上,嘗試使用鉛筆調試3列(寬度)和4行(高度)的圖像。

說,改變你的環行優先的順序寫入數據:

// write data to file 
int row, col; 
for (row = 0; row < height; ++row) 
{ 
    for (col = 0; col < width; ++col) 
    { 
     fprintf(grey, "%d ", (imageArray[row][col].red + imageArray[row][col].green + imageArray[row][col].blue)/3)); 
    } 
    fprintf(grey, "\n\r"); 
} 
+0

這幾乎是正確的我在做什麼...我只是把我的代碼放在OP中 – Luke 2012-02-27 17:32:15

+0

我沒有注意到你正在寫一個ascii文件 – pQB 2012-02-27 20:56:04

+0

我最初正在寫一個二進制文件......也沒有工作 – Luke 2012-02-27 22:11:36