2010-02-18 26 views
5

Mi piacerebbe farlo in una piattaforma indipendente, e so che libpng è una possibilità, ma trovo difficile capire come. Qualcuno sa come farlo in un modo semplice?Salvare un semplice buffer di immagini in png in C++

+0

È possibile usare [Imagemagick] (http://www.imagemagick.org/script/index.php) ma ha molte altre cose. –

risposta

5

C'è un wrapper C++ per libpng chiamato Png++. Controllalo here o semplicemente google it.

Hanno una vera interfaccia C++ con modelli e tale che utilizza libpng sotto il cofano. Ho trovato il codice che ho scritto molto espressivo e di alto livello.

Esempio di "generatore" che è il cuore dell'algoritmo:

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 

e l'uso è simile a questo:

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

Ci sono stati alcuni pezzi ancora mancanti libpng (opzioni Interleaving e quali), ma francamente non li ho usati quindi andava bene per me.

+0

È bellissimo! Grazie! – henle

+7

Non trovo questo bellissimo. Come può essere considerato bello? Qualcuno crede davvero che questo sia un modo corretto di rappresentare un'immagine? Mi dispiace usare un linguaggio così infiammatorio, ma nulla nella programmazione mi ha frustrato al punto che l'elaborazione delle immagini PNG ha. Perché renderlo più complicato di quanto debba essere? –

1

Direi che libpng è ancora il modo più semplice. C'è example read -> process -> write png program, è abbastanza semplice una volta che si smuove la gestione degli errori (setjmp/longjmp/png_jmpbuf). Non diventa più semplice di così.

+1

Sì, l'ho visto. Devo dire che ero confuso, ma ora che mi dici che è semplice, lo è davvero;) – henle

Problemi correlati