2013-06-11 1 views
0

에 여러 값을 쓰기 나는 다음과 같은 코드가 있습니다 : 그것은 나를 볼 (. 그것이 옳은 일을하고있어 확인) 참고하는 값을 그대로 출력한다는 점에서는 이진 파일

#include <Magick++.h> 
#include <iostream> 
#include <fstream> 

using namespace Magick; 
using namespace std; 

unsigned short int version = 1; 
unsigned short int cols, rows; 
short int myCol, myRow; 

int main(int argc, char **argv) { 
    ofstream myFile; 
    myFile.open("img001.bin", ios::out | ios::trunc | ios::binary); 
    myFile.write(reinterpret_cast<const char*> (&version), sizeof(version)); 

    try { 
    InitializeMagick(*argv); 
    Image img("noname-th.jpg"); 
    cols = img.columns(); 
    rows = img.rows(); 
    myFile.write(reinterpret_cast <const char*> (&cols), sizeof(cols)); 
    myFile.write(reinterpret_cast <const char*> (&rows), sizeof(rows)); 

    for (myCol = cols - 1; myCol >= 0; myCol--) { 
     for (myRow = rows - 1; myRow >= 0; myRow--) { 
     ColorRGB rgb(img.pixelColor(myCol, myRow)); 
     cout << "red: "  << (rgb.red() * 255); 
     cout << ", green: " << (rgb.green() * 255); 
     cout << ", blue: " << (rgb.blue() * 255) << endl; 
     } 
    } 
    } 
    catch (Magick::Exception & error) { 
    cerr << "Caught Magick++ exception: " << error.what() << endl; 
    } 
    return 0; 
} 

이 좋은 작품 : 예 , 나는 그것이 우하 구석에서 시작하고 0,0까지 읽는 것을 알고있다. 그것은 여기의 의도입니다.

내가 지금 필요한 것은 그 rgb 값을 열린 파일에 쓰는 방법을 찾는 것입니다. 각 픽셀에 대해 rgb.red() * 255, rgb.green() * 255 및 rgb.blue() * 255의 값을 얻습니다. 어떻게 이들을 r, g, b (라인 당 하나의 픽셀)로 저장합니까?) 파일에?

나는 그들에게 똑같은 char casting을 할 필요가 있다고 생각하지만, 그것들을 한 줄에 연결하는 방법을 모른다. 각 file.write()는 끝에 LF를 자동으로 추가합니다.

감사합니다.

+0

http://en.cppreference.com/w/cpp/io/basic_ostream/write –

+0

제안을 주셔서 감사합니다. 내가 이해하지 못하는 것은 하나의 문자열 (쉼표로 구분)으로 묶어서 쓰는 방법입니다. 단일 값을 그냥 쓸 수 있습니다 (char *로 캐스팅 한 후),하지만 파일에서 한 줄로 모두 세 가지를 수행하는 방법을 잘 모르겠습니다. – KirAsh4

+0

텍스트 파일이나 이진 파일을 쓰고 있습니까? 바이너리 인 경우 값을 쉼표로 구분해야하는 이유는 무엇입니까? –

답변

1

나는 rgb.red() 등이 모두 int이라고 가정합니다. 바이너리 파일은 LF 또는 CR의 개념이없는 것을

int red = (int)(rgb.red() * 256); 
myFile.write(reinterpret_cast <const char*> (&red), sizeof(red)); 

참고 : 그렇다면, 당신은 당신이 열과 행의 수를 썼다 정확히 같은 방법으로이 값을 쓸 수 있습니다. 그들은 read()write() 호출에 의해 해석하는 바이너리 데이터 만 포함합니다.

+0

사실, $ rgb.color()는 0에서 255 사이의 값을 얻기 위해 255로 곱 해지는 이유 인 float (0과 1 사이)를 반환합니다. 그러나 이전 주석에서 다른 것을 언급했는데 왜 쉼표. 나는 그것에 대한 대답이 없습니다. 저는 데이터를 쉼표로 구분하여 (ascii) 보는 데 익숙합니다. 그래서 제가 가정 한 것과 같은 일을해야합니다. 나는 그대로 쓰고 거기에서 갈 것 같아. 포인터를 가져 주셔서 감사합니다. – KirAsh4

+0

@ KirAsh4 ASCII 텍스트로 데이터를 출력 할 것인지 (쉼표로 구분하는 것이 확실 함) 또는 바이너리로 (쉼표가 필요없는 경우) 데이터를 출력할지 결정해야합니다. 또한 색상 값을 0.0에서 1.0 사이의 부동 소수점 수 또는 0에서 255 사이의 정수로 출력할지 여부를 결정해야합니다. 위의 코드는 이진 데이터를 쓰는 데 사용할 수 있습니다. 단순히'int red'를'float red'로 바꾸고, 선택적으로 256을 곱하십시오. –

+0

저는 바이너리를 쓰고 있습니다, 그래서 전체 콤마를 말하십시오. 그리고 나는 위의 코드에서 0과 255 사이의 int를 쓸 필요가있다. 255는이 값이 256이 아니라 올바른 값입니다. – KirAsh4

1

이진 파일에는 '개행'또는 선의 개념이 없습니다. 그들은 필사적 인 우리 인간이 우리에게 읽을 수 있도록 텍스트 파일만을위한 것입니다. 그래서 그 의미에서, 당신은 줄 바꿈에 대해 걱정할 필요가 없습니다. 이진 색상 값을 파일에 계속 기록하십시오. 걱정할 필요가있는 것은이 파일을 누가 사용하고 있는지 그리고 파일에 쓰는 데 사용하는 이진 형식이 해당 소비자에게 허용되는지 여부뿐입니다.

+0

"소비자"는 저입니다. 이것은 이미지 파일을 모든 픽셀에 대한 각각의 rgb 값으로 변환합니다. 그런 다음이 데이터 파일은 Arduino가 SD 카드에 액세스하여 데이터를 다시 가져와 일련의 LED로 푸시합니다. 이것은 훨씬 더 큰 부분에서 1 단계입니다. – KirAsh4