2010-02-18 16 views
5

Chciałbym zrobić to w sposób niezależny od platformy i wiem, że libpng to możliwość, ale ciężko mi zrozumieć, w jaki sposób. Czy ktoś wie, jak to zrobić w prosty sposób?Zapisywanie prostego bufora obrazu do png w C++

+0

Możesz użyć [Imagemagick] (http://www.imagemagick.org/script/index.php), ale robi to również kilka innych rzeczy. –

Odpowiedz

5

Istnieje opakowanie C++ dla libpng o nazwie Png++. Sprawdź to here lub po prostu google.

Mają prawdziwy interfejs C++ z szablonami i takie, które używają pod maską libpng. Znalazłem kod, który napisałem dość ekspresywnie i na wysokim poziomie.

Przykład „generator”, który stanowi centrum algorytmu:

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 

i wykorzystywany jest w następujący sposób:

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

Było kilka bitów nadal brakujące z libpng (opcji przeplatania i np), ale szczerze mówiąc nie korzystałem z nich, więc było to w porządku dla mnie.

+0

To jest piękne! Dziękuję Ci! – henle

+7

Nie uważam tego za piękne. Jak można to uznać za piękne? Czy ktokolwiek wierzy, że jest to właściwy sposób reprezentowania obrazu? Przepraszam, że używam takiego podżegającego języka, ale nic w programowaniu mnie nie frustruje do tego stopnia, że ​​przetwarza obrazy PNG. Dlaczego sprawić, by było bardziej skomplikowane, niż ma być? –

1

Powiedziałbym, że libpng jest nadal najprostszym sposobem. Jest example read -> process -> write png program, jest dość prosta, gdy usuniesz elementy obsługi błędów (setjmp/longjmp/png_jmpbuf). To nie jest prostsze.

+1

Tak, widziałem to. Muszę przyznać, że byłem zdezorientowany, ale teraz, gdy TY mÓWISZ, że to jest proste, to naprawdę jest;) – henle

Powiązane problemy