2010-02-18 6 views
5

플랫폼 독립적 인 방법으로이 작업을 수행하고 싶습니다. libpng이 가능성을 알고 있지만 어떻게 처리하는지 파악하기가 어렵습니다. 누구든지 간단한 방법으로이 작업을 수행하는 방법을 알고 있습니까?C++에서 png에 간단한 이미지 버퍼 저장하기

+0

[Imagemagick] (http://www.imagemagick.org/script/index.php)을 사용할 수 있지만 다른 여러 가지 작업도 수행 할 수 있습니다. –

답변

5

Png++이라고하는 libpng에 대한 C++ 래퍼가 있습니다. 그것을 확인하십시오 here 또는 그냥 구글.

템플릿과 실제 C++ 인터페이스가있어서 후드 아래 libpng을 사용합니다. 필자가 작성한 코드가 상당히 표현력이 풍부하고 높은 수준이라는 것을 알았습니다.

하여 알고리즘의 핵심이다 "발전기"의 예 :

class PngGenerator : public png::generator< png::gray_pixel_1, PngGenerator> 
{ 
    typedef png::generator< png::gray_pixel_1, PngGenerator> base_t; 
public: 
    typedef std::vector<char> line_t; 
    typedef std::vector<line_t> picture_t; 

    PngGenerator(const picture_t& iPicture) : 
    base_t(iPicture.front().size(), iPicture.size()), 
    _picture(iPicture), _row(iPicture.front().size()) 
    { 
    } // PngGenerator 

    png::byte* get_next_row(size_t pos) 
    { 
    const line_t& aLine = _picture[pos]; 

    for(size_t i(0), max(aLine.size()); i < max; ++i) 
     _row[i] = pixel_t(aLine[i] == Png::White_256); 
     // Pixel value can be either 0 or 1 
     // 0: Black, 1: White 

    return row_traits::get_data(_row); 
    } // get_next_row 

private: 
    // To be transformed 
    const picture_t& _picture; 

    // Into 
    typedef png::gray_pixel_1 pixel_t; 
    typedef png::packed_pixel_row<pixel_t> row_t; 
    typedef png::row_traits<row_t> row_traits; 
    row_t _row; // Buffer 
}; // class PngGenerator 

및 사용은 다음과 같이이다 : 일부 여전히 libpng에서 누락 된 비트 (인터리빙 옵션 등이 있었다

std::ostream& Png::write(std::ostream& out) 
{ 
    PngGenerator aPng(_picture); 
    aPng.write(out); 
    return out; 
} 

). 솔직히 나는 그들을 사용하지 않았다. 그래서 그것은 나에게 좋았다.

+0

그것은 아름답다! 고맙습니다! – henle

+7

나는이 아름다운 것을 발견하지 못한다. 어떻게 이것이 아름다운 것으로 간주 될 수 있습니까? 아무도 이것이 실제로 이미지를 표현하는 적절한 방법이라고 생각합니까? 그런 염증성 언어를 사용하는 것을 유감스럽게 생각하지만 프로그래밍에있어 PNG 이미지를 처리하는 데있어 좌절감을 느끼지는 못했습니다. 왜 더 복잡하게 만들어야합니까? –

1

저는 libpng이 여전히 가장 쉬운 방법이라고 말하고 싶습니다. example read -> process -> write png program이 있는데 오류 처리 (setjmp/longjmp/png_jmpbuf) 항목을 제거하면 상당히 간단합니다. 그것보다 간단하지 않습니다.

+1

예, 나는 그것을 보았습니다. 나는 말해야한다, 나는 혼란 스러웠다. 그러나 지금 당신은 그것이 단순하다는 것을 나에게 이야기한다, 그것은 정말로이다;) – henle

관련 문제