2015-06-14 76 views
0

我在這裏發現了一些用於讀取/寫入圖像的C++代碼。我想改進它,這樣我可以旋轉等圖像。但是,一開始我有一些問題。當我寫圖像時,似乎我的讀取功能只讀取其中的一部分,因爲它只寫入一部分原始圖像。請看我的代碼和輸入,輸出圖像。讀取/寫入PPM圖像C++,新圖像中斷

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main(int argc, char **argv) 
{ 
    ifstream in; 
    in.open("OldImage.ppm", std::ios::binary); 

    ofstream out; 

    std::string magic_number; 
    int width, height, maxColVal, i, j; 

    in >> magic_number; 
    in >> width >> height >> maxColVal; 
    in.get(); 

    char **image; 
    image = new char* [width]; 

    for(i=0; i<width; i++) 
    { 
     image[i] = new char [height]; 

     for(j=0; j<height; j++) 
     { 
      in >> image[i][j]; 
     } 
    } 

    out.open("NewImage.ppm", std::ios::binary); 
    out << "P3"  << "\n" 
     << width  << " " 
     << height  << "\n" 
     << maxColVal << "\n" 
     ; 

    for(i=0; i<width; i++) 
    { 
     for(j=0; j<height; j++) 
     { 
      out << image[i][j]; 
     } 
    } 

    in.clear(); 
    in.close(); 

    out.clear(); 
    out.close(); 

    return 0; 
} 

輸入圖像:https://www.dropbox.com/s/c0103eyhxzimk0j/OldImage.ppm?dl=0

輸出圖像:https://www.dropbox.com/s/429i114c05gb8au/NewImage.ppm?dl=0

回答

0

根據this doc有2所形成ppm的圖像文件的:原料和滑動。您似乎假設正常的原始格式,但您使用幻數P3這是普通的ppm。試試P6

此外,您的高度和寬度循環應該是相反的方式,但這不影響結果。推測它是旋轉圖像的代碼的一部分。

+0

它沒有解決我的問題 – yak

0

ppm文件對於每個像素具有3個值(R,G和B)。你的代碼假設只有1個值(強度?)。嘗試讀取和寫入pgm文件(「magic_number」等於P2)。

另外,閱讀所有的3個值對每個像素:

typedef char (*row_ptr)[3]; 
// I don't know how to express the following without a typedef 
char (**image)[3] = new row_ptr[height]; 
... 
for(i=0; i<height; i++) 
{ 
    image[i] = new char[width][3]; 

    for(j=0; j<width; j++) 
    { 
     for(colour=0; colour<3; colour++) 
     { 
      in >> image[i][j][colour]; 
     } 
    } 
} 

注意,我換的widthheight的地方,所以代碼相匹配的文件中的像素的順序。使用有意義的名稱(如xy)作爲座標也不失爲一個好方法,而不會混淆名稱,如ij

+0

根據我的代碼更改我的代碼:http://pastie.org/private/adweu6nup9gy0zglbwnujq但具有相同的效果:( – yak