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++
Respuesta
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í.
¡Eso es hermoso! ¡Gracias! – henle
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? –
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.
Sí, lo vi. Debo decir que estaba confundido, pero ahora que me DICE que es simple, realmente lo es;) – henle
- 1. Guardando System.Drawing.Graphics en un png o bmp
- 2. Crear imagen PNG con C# HttpHandler webservice
- 3. guardando la imagen QML
- 4. Guardando el panel como una imagen
- 5. convertir uiview a .png imagen
- 6. Guardando matriz 2D numérica en la imagen
- 7. C# Guardando imágenes enormes
- 8. Bmp a jpg/png en C#
- 9. Win32 C/C++ Cargar imagen del buffer de memoria
- 10. Cómo convertir una cadena Base64 imagen PNG a PNG Formato en C#
- 11. Guardando imagen en el núcleo Data
- 12. C#: Guardando archivos JPG en partes
- 13. Convertir imagen SVG a PNG con PHP
- 14. Java convertir imagen GIF a formato PNG
- 15. Lectura de un archivo de imagen PNG en .Net 2.0
- 16. Cómo convertir una imagen JPG a PNG
- 17. Redimensionar imagen PNG
- 18. Cambiar la imagen png blanca a un color específico
- 19. Copiando una imagen a transcodificaciones de cartón jpeg a png
- 20. Lectura de una imagen PNG en Node.js
- 21. iPhone - guardando la vista actual como imagen
- 22. ¿Manera simple de leer valores de color de píxeles desde una imagen PNG en el iPhone?
- 23. Crear una imagen de un DIV en JavaScript (GIF/PNG)
- 24. Convertir bitmap a PNG en la memoria en C++ (win32)
- 25. Cómo convertir la imagen .png a .pdf en iphone programáticamente
- 26. ¿Convertir imagen JPG/GIF a PNG en PHP?
- 27. Crear una imagen PNG dinámica
- 28. Renderizar swf a png u otro formato de imagen
- 29. Guardar como una imagen png en Android
- 30. Imagen PNG transparente (con TImageList) en un TMainMenu
Puede usar [Imagemagick] (http://www.imagemagick.org/script/index.php) pero también hace varias otras cosas. –