2017-03-01 10 views
0

저는 ppm 이미지를 읽고 객체로 저장 한 다음 다시 쓸 프로그램을 작성하려고합니다. 이상적으로, 픽셀을 int 타입 객체로 저장하고 싶습니다만, 문자로만 비슷한 이미지를 얻을 수 있습니다. 불행히도 char 객체를 사용하더라도 이미지가 회색으로 표시됩니다. 왜 저장소 유형을 변경하면 큰 변화가 발생하는지, 셰이프가 유지되면 이미지 색이 손실되는 이유를 모르겠습니다.C++ 읽기/쓰기 PPM 이미지 파일이 회색으로 표시됩니다.

다른 ppm 프로그램 질문을 여기에서 살펴 보려고했지만 답변의 머리말이나 꼬리를 만들 수 없습니다 (또는 관련성이있는 경우). 나는이 언어에 익숙하지 않으며 무슨 일이 일어날 지 모릅니다.

누구나 내가 잘못하고있는 것을 설명 할 수 있고 char 대신 int 형식으로 데이터를 저장하는 데 사용할 수있는 전략이 있다면 대단히 감사 할 것입니다.

다음은 ppm 클래스의 파일 읽기 및 파일 쓰기 코드입니다. 주 함수는 ppm 객체를 초기화하고 readfile()을 호출 한 다음 writefile()을 호출합니다. 어딘가에는 이미지를 보존하지 못합니다.

void PPM::readFile(std::string filename) 
{ 
    std::ifstream file; 
    std::string stuff; 
    char junk; 
    file.open(filename, std::ios::binary); 
    file >> stuff >> width >> height >> maxCol; 
    file >> std::noskipws >> junk; 
    int i = 0; 
    char r, g, b; 
    std::cout << width*height; 
    while (i < width*height) 
    { 
     file.read(&r, 1); 
     file.read(&g, 1); 
     file.read(&b, 1); 
     red.push_back(b); 
     grn.push_back(b); 
     blu.push_back(b); 
     i++; 
     std::cout << i << std::endl; 
    } 
} 

void PPM::writeFile(std::string filename) const 
{ 
    std::ofstream file; 
    file.open(filename, std::ios::binary); 
    file << "P6 " << width << " " << height << " " << maxCol << std::endl; 
    int i = 0; 
    std::cout << width << " " << height; 
    while (i < width*height) 
    { 
     file.write(&red[i], sizeof(red[i])); 
     file.write(&grn[i], sizeof(grn[i])); 
     file.write(&blu[i], sizeof(blu[i])); 
     std::cout << "iteration " << i << std::endl; 
     i++; 
    } 
} 

다시 한번 감사 어떤 도움을 당신이이 버그

+0

'빨강', '녹색'및 '블루'란 무엇입니까? –

답변

1
red.push_back(b); 
grn.push_back(b); 
blu.push_back(b); 

제공 할 수 있습니다. r, g 및 b를 각각 뒤로 밀어야합니다. 또한 char을 int로 변경하면 아래 주석에서 지적한 것처럼 더 안전합니다.

+1

또 다른 버그는 그가 maxCol을 확인하지 않는다는 것입니다. [PPM spec] (http://netpbm.sourceforge.net/doc/ppm.html)에 따르면 maxCol> 255 일 경우 색 채널 당 2 바이트가 있습니다. 그래서이 경우 r, g, b는'uint16_t' 유형이어야합니다. – zett42

+0

이 프로그램은 색상 채널이 255 이하로 설정되어 있다고 가정하므로 실제로 적용 할 수있는 안전 장치가 없습니다. 아마 나중에 그것들을 추가 할 것이고, unit16_t 타입에 대해 말해 주셔서 감사합니다! – Forstrei