2016-11-04 41 views
-1

グレースケールイメージをテキストイメージとして保存しようとしていますが、各ピクセルはImageクラスのfloatとしてm_p_imageとして保存されています。 Image.cpp複数のフロートをテキストファイルから読み込みます

//------------- 
Image::Image(): 
//------------- 
     m_width(0), 
     m_height(0), 
     m_p_image(0) 
//------------------ 
{} 

からImage.h

/// Number of pixel along the horizontal axis 
unsigned int m_width; 


/// Number of pixel along the vertical axis 
unsigned int m_height; 


/// The pixel data 
float* m_p_image; 

から

画像テキストファイルが同じように設定されている:彼らは山車の任意の番号を持つことができますが

0.500 0.500 0.500 0.500 0.500 0.500 0.500 
0.500 0.500 0.000 0.000 0.500 0.500 0.500 
0.500 0.500 0.000 0.000 0.500 0.500 0.500 
0.500 0.500 0.500 0.500 0.500 0.500 0.500 

それらの中に。

私は、これらの山車を読んで、私の1次元のfloat配列m_p_imageに保存し、また、各行(m_width)と各列の山車の数にフロートの数を取得するための最良の方法(m_heightは何ですか)?行を文字列として読み込んでキャストするのが最善でしょうか?

+0

テキスト形式は画像には適していません –

答えて

0

私が考えることができる最も簡単な方法は、テキストの上部に列/行を指定し、行を壊さないようにすることです。

それは次のようになります。

7 4 
0.500 0.500 0.500 0.500 0.500 0.500 0.500 0.500 0.500 0.000 0.000 0.500 0.500 0.500 0.500 0.500 0.000 0.000 0.500 0.500 0.500 0.500 0.500 0.500 0.500 0.500 0.500 0.500 

は、それは文字列としてのラインを読み、それらをキャストするのが最善ですか?

あなただけのfloat値を直接floatとしてそれらを読んで、その後に来ていることは(将来の要件が変更されるまで)は悪い考えではないことを保証することができます。

0

float m_p_image[width*height]; 
fstream fs("file.txt"); 
for(int i=0; i<width*height; i++) 
    fs >> m_p_image[i]; 

私の1次元のfloat配列のm_p_imageに保管してください。しかし、他のポストのように、あなたのプログラムの中で1D配列に格納したい場合は、その理由で2Dとして保存わざわざ言います、 TXT。

ファイルの非常に最初の行にメタデータとして格納気にならないのであれば容易になるだろう数行(m_width)と列(m_height)

を取得し、

言います
2 3 
0.1 0.1 
0.1 0.1 
0.1 0.1 

それ以外の場合は、getline関数を使用して\nまで読むことができ、改行の前にエンティティの数を数えます。

string line; 
std::getline(fs, line); 
stringstream ss(line); 
int m_width=0; 
while(ss >> m_p_image[m_width++]) ; 

m_heightは、getlineの呼び出しをカウントすることによって記録できます。

また、istreamが嫌いなら、fscanfも良いでしょう。

関連する問題