PNGwriter logo



Última modificación: 29 V 2006

[english version]
[日本語の ページ]

PNGwriter es una librería de C++ para crear imágenes PNG.


(Si no puedes ver el menú de navegación a la izquierda, entonces haz click aquí).


Últimas Noticias:

  • Nuevo! - PNGwriter versión 0.5.3 está disponible! Bájalo aquí y entérate aquí.

  • Nuevo! - PNGwriter ha sido incluido en la distribución de Linux Debian, gracias a los esfurezos de Miguel Gea Milvaques! Enterate aquí!


  • Quieres mantenerte al día? Tienes un problema? Postea en el foro

  • Tienes una imagen, programa o implementación interesante que creaste con la ayuda de PNGwriter? Envíalo, o cuéntale al mundo en el foro.

  • Echale una mirada al poster que presenté en el Segundo Simposio de Estudiantes de Física de Chile (21, 22 y 23 de Julio, 2004). (PDF, app. 6 MB, TGZ | ZIP

  • Visita la página de proyecto de PNGwriter en SourceForge.net y Freshmeat.net.


Resumen

PNGwriter es una librería gráfica que usa el formato PNG. La interface ha sido diseñada para ser lo más simple e intuitiva posible. Permite plotear y leer en los espacios de colores RGB (rojo, verde, azul), HSV (hue, saturation, value/brightness) y CMYK (cyan, magenta, amarillo, negro), firguras básicas, escalamiento de imágenes, interpolación bilineal, soporte completo para texto TrueType rotado y con antialiasing, curvas bezier, abrir imágenes PNG ya existentes y más. Documentación en inglés y español. Funciona en Linux, Unix, Mac OS X y Windows. Requiere libpng y opcionalmente FreeType2 para el soporte de texto.



Preguntas frecuentes:














Si tus preguntas no son respondidas, haz la pregunta en el foro PNGwriter Forum, o anda a Contactos y mandame un email.





Porqué usar la librería PNGwriter?

Porque es una manera rápida y fácil de plotear directamente desde tu programa de C++.

PNGwriter permite que te enfoques en tu programa, y evita que pierdas tiempo en aprender cómo manejar y crear imágenes PNG. Sólo necesitas especificar el tamaño de tu imagen, y luego vas ploteando pixel por pixel en un color dado, usando la función plot.


PNGwriter fue escrito originalmente teniendo en mente a los científicos. La necesidad de crear imágenes desde un programa surge generalmente como parte natural del uso científico de la programación. Sacar los datos desde el programa a una imagen de alta calidad de manera eficiente puede a veces ser difícil, especialmente si el usuario no es un programador muy experimentado. Los métodos usados pueden ser altamente ineficientes o demasiado complejos como para ser factibles.

Si los datos que el programa produce son de la forma (x,y), podremos usar cualquiera de los muchos programas para plotear que existen, como gnuplot, el excelente Abscissa por R. Brühl, etc.

Sin embargo, si los datos que produce el programa son de la forma (x, y, z), entonces deberemos elegir cómo representar la tercera variable. Software como Mathematica ofrece muchas alternativas en esta área, pero si la cantidad de puntos de datos es considerable, entonces el renderear una imagen como un arreglo de pixeles usando datos en formato texto usando Mathematica es muchas, muchas veces más lento que renderear la imagen al disco desde el programa de C++ mismo. Considera los problemas involucrados: el programa debe producir un archivo, escribiendo los datos en modo ASCII. Esto es aproximadamente dos órdenes de magnitud más lento que escribirlo en modo binario. Luego debe ser rendereado por Mathematica, usando gráficos vectoriales (vector graphics, un objeto por pixel). Es sólo en éste momento que uno puede convertir la imagen a una imagen bitmap sin pérdidas como TIFF o PNG. Otra posibilidad es usar ImageMagick o Netpbm para procesar los datos, pero nuevamente, uno está limitado por el tener que escribir los datos en modo ASCII, y el soporte de color de 24 bits en el formato PPM no está estandarizado (en otras palabras, es práticamente inexistente), y es endian-dependent (depende de la arquitectura de tu CPU).

PNGwriter fue escrito justamente para ofrecer una alternativa. Su interface es extremadamente intuitiva, hay sólo un objeto nuevo para aprender (la clase PNGwriter), en otras palabras, no hay clases y subclases para pixeles, colores, bitmaps, nombres de archivo, etc. Con tal de que sepas de qué color quieres el pixel en la posición (x, y), puedes implementar cualquier algoritmo que quieras. Quieres jugar con autómatas celulares pero estás cansado de ver los resultados como un arreglo de texto de 1s y 0s? Quieres explorar fractales tú mismo? Necesitas una manera rápida de implementar ese algoritmo de reconocimiento de imágenes en el cual estás trabajado para tu vehículo autónomo o brazo robot? Quieres simular una lente gravitacional pero todavía no has podido crear una imagen con tu algoritmo? Necesitas simular un objeto moviéndose en una superficie de emergía, usando interpolación entre los puntos de datos? PNGwriter te puede ayudar!



Qué puedo hacer con PNGwriter?

PNGwriter permite hacer lo siguiente con una imagen:
  •       Plotear
  •       Averiguar el color de un pixel
  •       Leer un PNG ya existente para trabajar con él.
  •       Plotear en el espacio de colores HSV y CMYK.
  •       Averiguar el color de un pixel en el espacio de colores HSV y CMYK.
  •       Plotear lineas, circulos, rectangulos, huecos o llenos, opacos o trasl&uacte;cidos.
  •       Plotear texto con cualquier fuente TrueType.
  •       Ajustar el gamma de la imagen.
  •       Elegir el nivel de compresion.
  •       Cambiar el nombre del archivo.
  •       Re-escalar la imagen.
  •       Averiguar el alto, ancho y bit depth de una imagen.
  •       y mucho más!.


Al poder generar una cantidad arbitraria de imágenes PNG con cada corrida de tu programa, y dado que PNGwriter provee un método fácil de nombrar los archivos especificando sólo un número de índice, es posible crear videos de imágenes secuenciales. Para esto, uno podría usar MEncoder.



Porqué usar imágenes de tipo PNG?

Porque son ampliamente conocidas e incorporan compresión sin pérdidas.

Comparten ciertas características con las imágenes GIF, pero a diferencia de éstas, no están atadas por el copyright de la compresión LZW de los GIF.

El formato PNG es abierto, libre y bueno.

Ofrecen la posibilidad también de usar Alpha Channels (transparencia) y un montón de otras cosas interesantes y útiles.

Ni siquiera tienes que convertirlos si quieres mostrar tus resultados en tu página web: PNG significa Portable Network Graphics-- fueron diseñados para internet y cualquier browser decente los puede mostrar. De hecho, la mayoría de los gráficos en este sitio son PNG :-)

Para mas información recomiendo visitar www.libpng.org.



A quién está dirigida esta librería de C++?

Escribí PPMWriter (ver más abajo) porque quería algo que me permitiese plotear pixel por pixel una imagen, dando sólo las coordenadas y los coeficientes de color de éste. Era útil (aunque PNGwriter ha avanzado mucho, mucho más lejos que PPMwriter) aunque limitado y no enteramente libre de bugs :-), pero eran pocos los programas que podían procesar el formato PPM correctamente. Es por eso que nació PNGwriter.

En principio le podría ser útil a cualquiera que necesite plotear imágenes de alta calidad generada por programas de C++ (simulaciones, cálculos, etc.) y no diagramas.


Qué necesito para usar la librería PNGwriter?

Un compilador de C++, y libpng. libpng funciona en Unix, DOS, OS/2, Windows, Mac OS, BeOS, Amiga, etc. Si tu compilador es viejo, mi recomendación personal es GCC. Mira www.cplusplus.com/info/compilers/#free para obtener información acerca de compiladores libres. Si quieres compilar PNGwriter con soporte de texto, necesitarás FreeType2. Si está en Windows, mira la sección "Cómo puedo usar PNGwriter en Windows?".



PNGwriter puede dibujar texto y ejes de gráficos?

Sí, PNGwriter ahora tiene soporte completo de texto (incluyendo soporte para codificación UTF-8), pero no crea ejes. Ésta es la razón oficial: PNGwriter está orientado a la generación rápida e intuitiva de imágenes de alta calidad resultando de simulaciones científicas o del procesamiento de imágenes. Cualquier imagen bitmap que requiera ejes y que debe ser publicado en calidad de publicación debería usar gráficos vectoriales para los ejes (y quizás el texto), no bitmap, y combinar ambos en un EPS.

Así que todo está perdido? No hay nada que se pueda hacer? Claro que si! Aquí hay una solución: Crea imágenes PNG de los ejes de gráfico que quieres agregar a tu imagen, usando el método de tu elección (The Gimp, Photoshop, etc.). Hazlos negro sobre blanco, por ejemplo. Desde tu programa, abre este archivo con PNGwriter. Escribe una rutina simple que tome todos los pixeles negros, y los plotee en tu imagen, en la posicion que tu especificas, y en el color que quieras. Esto puede ser automatizado, de manera que se hace al terminar cada imagen que creas.



Suena interesante, cómo se usa?

Si quieres ver el ejemplo más simple posible del uso de PNGwriter, anda a Quickstart. Es lo mínimo que necesitas para usar PNGwriter (y, en realidad, lo único que necesitas saber, en la gran mayoría de los casos).

Si quieres ver más ejemplos de PNGwriter en uso, anda a Ejemplos.

Si quieres mirar el manual de PNGwriter, anda a la sección Manual. El paquete de PNGwriter, disponible en la sección Downloads contiene dos ejemplos completos y un manual PDF. El archivo header de la librería está extensamente comentado.

Si quieres hacer una pregunta, puedes mandar un email al email que encontrarás en Contactos, o puedes postear una pregunta en el foro de PNGwriter.



Cómo usar PNGwriter en Windows?

Deberís obtener una implementación en Windows de GCC, el compilador C/C++ libre de la GNU (dos maneras posibles de hacer esto son www.mingw.org y www.cygwin.com). También puedes usar Borland C++ Builder o Microsoft Visual C++ .NET en Windows XP. Aquí hay dos explicaciones simples y paso a paso (en inglés, por ahora): "Setting Up PNGWriter for Borland C++ Builder Version 6 on Windows XP" y "Setting Up PNGWriter for Microsoft Visual C++ .NET on Windows XP".
Además, usar PNGwriter con Bloodshed Dev C++ es bastante fácil, como comenta Siva Chandra: "Puedes bajar las librerías pre-compiladas de freetype del website de GnuWin32: gnuwin32.sf.net. Para compilar a PNGwriter, crea un nuevo proyecto de librería de C++ llamado libpngwriter. Incluye el archivo header de PNGwriter y el archivo de implementación en este nuevo proyecto. Compila. Eso es todo! Ahora tendrás tu archivo libpngwriter.a listo para ser usado. Nota que esto asumirá por defecto la disponibilidad de freetype. Para remover ese supuesto, deberas compilar con esta opción: -DNO_FREETYPE".
Nota: Debes cambiar el nombre de pngwriter.cc a pngwiter.cpp para compilarlo con MSVC7. Si la extension no se cambia, entonces la propiedad del directorio de C/C++ para el proyecto no se será visible. En este caso el valor por defecto de MSVC7 de usar headers precompilados en su build del proyecto siempre tirará un error diciendo que no puede encontrar un cierto header precompilado. Es necesario entonces cambiar esa característica en las propiedades del proyecto para compilar la librería PNGwriter exitosamente.
El usuario Giancarlos Colasante gentilmente ha enviado un procedimiento que creó con ayuda de Siva Chandra: "Como correr PNGwriter bajo Windows con Dev-C++":
  1. Descarga Zlib , LibPng y FreeType. Instálalos. Hay 2 formas: zip y setup (remomendada).
  2. Descarga pngwriter. Descomprímelo en cualquier carpeta.
  3. En el menú de Dev-C++ "Tools > Compiler Options > Directories(pestaña) " agrega desde ...\GnuWin32\ las carpetas bin, lib, include y include\freetype2\freetype en las pestañas Binaries, Libraries y C++ includes respectivamente.
  4. En Dev-C++ crea un Proyecto tipo Static Library y llámalo libpngwriter. Guárdalo en ...\pngwriter-0.5.3\src\. En el menú "Project > Add to Project" coloca pngwriter.cc que está en la misma carpeta. En el menú "Execute > Compile" y listo. Debes tener libpngwriter.a en esa carpeta, muévelo a ...\Dev-Cpp\lib\ y  pngwriter.h a ...\Dev-Cpp\include\
  5. Desde ...\GnuWin32\bin\ copia los .dll (freetype6, libpng13 y zlib1) a ...Windows\system32\
  6. Prueba que todo salió bien corriendo el ejemplo Quickstart. En Dev-C++ crea un Proyecto, pega el cóigo del ejemplo. En el menú "Project > Project Options > Parameters(pestaña) > Linker (casilla)" agrega: -lpngwriter, -lfreetype, -lpng. Compílalo y listo.



Qué hay en el paquete PNGwriter?
El tarball/zip de PNGwriter contiene lo siguiente:


pngwriter-x.y.z
       .
       |-- Makefile
       |-- README
       |-- configure
       |-- doc
       |   |-- english
       |   |   |-- CHANGES
       |   |   |-- EXAMPLES
       |   |   |-- LICENSE
       |   |   |-- PNGwriterQuickReference_EN.pdf
       |   |   `-- README
       |   `-- espaniol
       |       |-- CAMBIOS
       |       |-- EJEMPLOS
       |       |-- LEAME
       |       |-- LICENCIA
       |       `-- PNGwriterQuickReference_ES.pdf
       |-- examples
       |   |-- Makefile
       |   |-- burro.png
       |   |-- lyapunov.cc
       |   |-- lyapunov.espaniol.cc
       |   |-- pngtest.cc
       |   `-- pngtest.espaniol.cc
       |-- fonts
       |   |-- FreeMonoBold.ttf
       |   `-- FreeSansBold.ttf
       |-- make.include -> make.include.linux
       |-- make.include.linux
       |-- make.include.linux.oldcpp
       |-- make.include.osx
       `-- src
           |-- Makefile
           |-- pngwriter.cc
           `-- pngwriter.h



Qué puedo hacer si no puedo/no quiero instalar libpng?

En principio, todos deberian poder usar PNGwriter, hasta usuarios de Windows (ver " Cómo usar PNGwriter en Windows?").

Si no quieren, entonces siempre existe PPMWriter. Es una clase de C++ para crear imágenes PPM. Son más simples que las PNG, y las abren menos programas, pero puedes usar esa clase en cualquier computador y es completamente autocontenida. Más información en ket.dyndns.org/ppmwriter. Nota: el desarrollo de PPMWriter ha cesado hace tiempo ya, y sólo tiene una fracción de las funciones de PNGwriter.


Cómo puedo linkear a el proyecto PNGwriter desde mi página?

Encontraste útil a PNGwriter? Si es así entonces corre la voz, y cuéntale a los demás, poniendo el siguiente botón en tu página. Quien sabe, podrí ser exactamente lo que alguien estábuscando.


Made With PNGwriter


Si quieres, puedes linkear directamente a la imagen del sitio de PNGwriter. En tal caso, agrega el siguiente código a tu página:

<a href="http://pngwriter.sourceforge.net/"><img src="http://pngwriter.sourceforge.net/site_images/madewith.png" width="88" height="31" alt="Made With PNGwriter" BORDER="0" target="_blank"> </a >


Acerca del Autor

Vivo en Santiago, Chile. Quizás quieras echarle un vistazo a mi blog, si te gusta la fotografía (o simplemente las buenas fotos) o las motos. Hay una versión en español (El Cantar De La Lluvia) y una en inglés (The Flight of the Platypus).



.
SourceForge.net Logo Valid HTML 4.01! Valid CSS!


© 2002, 2003, 2004, 2005, 2006 Paul Blackburn