2010-02-18 13 views
5

Me gustaría hacer esto en una plataforma de forma independiente, y sé que libpng es una posibilidad, pero me resulta difícil averiguar cómo. ¿Alguien sabe cómo hacer esto de una manera simple?Guardando un buffer de imagen simple a png en C++

+0

Puede usar [Imagemagick] (http://www.imagemagick.org/script/index.php) pero también hace varias otras cosas. –

Respuesta

5

Hay un contenedor de C++ para libpng llamado Png++. Verifíquelo here o simplemente escríbalo en google.

Tienen una interfaz C++ real con plantillas y tal que usa libpng debajo del capó. He encontrado el código que he escrito bastante expresivo y de alto nivel.

Ejemplo de "generador", que es el corazón del 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 

y su uso es la siguiente:

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

Había algunos bits todavía faltan de libpng (opciones de intercalado y tal), pero francamente no los usé, así que estaba bien para mí.

+0

¡Eso es hermoso! ¡Gracias! – henle

+7

No me parece hermoso. ¿Cómo puede esto ser considerado bello? ¿Alguien realmente cree que esta es una forma adecuada de representar una imagen? Perdón por utilizar un lenguaje tan incendiario, pero nada en la programación me ha frustrado hasta el punto de que el procesamiento de imágenes PNG sí lo ha hecho. ¿Por qué hacerlo más complicado de lo que debe ser? –

1

Yo diría que libpng sigue siendo la forma más fácil. Hay example read -> process -> write png program, es bastante simple una vez que quitas las cosas de manejo de errores (setjmp/longjmp/png_jmpbuf). No es más simple que eso.

+1

Sí, lo vi. Debo decir que estaba confundido, pero ahora que me DICE que es simple, realmente lo es;) – henle