PPMWriter 1.3.3
[ Intro | Porque? | Formato PPM | Download | Contenido | Version History | Contacts | Legal | Ejemplo | Funciones ]
Importante - Important
Castellano:
PPMWriter probablemente no será actualizado dado que existe PNGwriter. Realmente recomiendo que uses PNGwriter en vez de PPMwriter: sus ventajas sombre PPMWriter son demasiadas para nombrar aqui. PPMWriter todaviía es muy útil si es que no puedes o no quieres instalar libpng para poder usar PNGwriter (pero si estás en una máquina UNIX o Linux, probablemente ya está instalado). Si quieres ayuda con PPMWriter, una sugerencia, o un comentario, anda a la pagina de PNGwriter, y en la seccion de Contactos encontraras un email donde contactarme. Respondere lo antes posible.
English:
PPMWriter is no longer being updated, because PNGwriter is available. I strongly reccomend you use PNGwriter instead: it's advantages are too many to list here. PPMWriter is still useful, though, in case you can't/don't want to install libpng to be able to use PNGwriter (if you're on a Linux/UNIX machine then chances are you already have it). The site for PPMWriter is in spanish only, however, I would be happy to help with any questions or comments you may have. To contact me, go to the PNGwriter page, and click on Contacts. There you will find an email. I will answer as soon as I can.
Introduccion
Clase de C++ para escribir archivos de imagen de tipo PPM.
Esta clase debe su existencia a mi interes por obtener resultados graficos de alta calidad con mis programas. Se que existen otras alternativas, pero considero que esta esta bastante bien para alguien que solo quiere sacar una imagen de inmediato y sin problemas, sea cual sea su sistema operativo.
Porque usar PPMWriter?
Esta clase podria ser de gran utilidad en los siguientes casos:
> Se necesita una manera de graficar en cualquier computador, sea cual sea su sistema operativo.
>Se busca una forma de graficar sin usar el modo grafico (XFree86, etc).
> Se necesitan crear varias imagenes en una misma corrida del programa, ojala sin intervencion del usuario.
>Se requiere nombrar el archivo de salida en base a algun criterio que puede cambiar mientras se esta graficando. Esto podria ser util para generar una serie de imagenes, y luego convertir la serie a una pelicula.
> Si la imagen es muy grande, plotear directamente a la pantalla puede demorarse mucho, y requiere que uno este presente para guardar el resultado final. Con esta clase es factible dejar el programa corriendo con
nohup miprograma &
y abrir luego el archivo en Eeyes, XView o The Gimp, que, en general, sera mucho mas rapido que abrirlo con algun visor personalizado.
> Se busca una solucion inmediata (confiable, facil de usar) y que casi no requiere de aprendizaje (basta con imprimir
PPMWriter Quick Reference).
> Para gente del departamento de Fisica de la U. de Chile: Se busca algo mas simple que las clases pizarra o ventana.
Acerca de los archivos PPM
Se pueden crear en dos modos: ASCII o binario. En version ASCII, los archivos .ppm son grandes e ineficientes, pero son faciles de usar y de inspeccionar a simple vista. En version binaria los archivos son mucho mas pequenios, y se escriben mucho mas rapido. Cada pixel es una combinacion de hasta 65535 niveles de rojo, verde y azul.
EEyes, The Gimp, XView y otros programas (busca en www.download.com si quieres uno para Windows) abren archivos ppm, y pueden ser convertidos a otro formato si se desea.
Nota importante: A partir de la version 1.3.2 se ha implementado la posibilidad de escribir archivos en version binaria de hasta 65535 niveles de color.. Esto resulta en una perfornamce muchisimo mas rapida y en archivos mucho mas pequenios que en la version ASCII. Sin embargo, hay algunos programas que no reconocen las especificaciones actuales del formato PPM, y, en consecuencia, solo abren imagenes escritas en modo binario de hasta 255 niveles de color. Estoy investigando que programas funcionan y cuales no. Aqui hay algunas recomendaciones:
Recomendaciones
Revisa la Lista de Visores Compatibles para ver que programas abren que versiones de archivos PPM.
Si no requieres de muchos niveles de color, haz tus imagenes en formato binario, con menos de 255 niveles de color.
Si requieres de mas de 255 niveles de color (para que se vean realmente hermosas), prueba en modo binario en 65535 o menos niveles de color. Trata de abrir una imagen .PPM producida de esta manera con el programa que vas a usar para abrir y ver y convertir tus imagenes. Si no lo abre, o lo abre de manera insatisfactoria (bandas de color, etc), puedes probar otro programa, o producir la imagen en modo ASCII. De estas dos posibilidades, la mas satisfactoria sera usar otro programa, porque una vez que sepas que programa te sirve, podras hacer todas tus imagenes en modo binario de alta calidad de manera eficiente y rapida.
Puedes probar los programas que esten a tu disposicion con la imagen mandel1.ppm que produce el programa de ejemplo.
La clase PPMWriter usa una clase para un tensor de rango 3 que viene incluida. Como esta clase se usa de manera transparente, no hay documentacion incluida para ella, pero es bastante simple y util. Tambien es posible utilizarla como un tensor de rango 2 (una matriz) bastante eficiente y rapida.
Download Section
La ultima version de PPMWriter la puedes conseguir aqui, en dos formatos. Los usuarios de Linux y otros sistemas tipo Unix pueden bajar el archivo .tgz. Los usuarios de Windows pueden bajar el archivo .zip. Los usuarios de MacOS pueden bajar cualquiera de los dos.
Esta pagina y PPMWriter estan disponibles desde http://ket.dyndns.org/ppmwriter/ y de http://zeth.ciencias.uchile.cl/~pblackb/ppmwriter/, sin embargo, esta ultima pagina probablemente este bastante desactualizada.
Contenido:
| Item |
Size |
Makefile |
488 B |
mandel.cc |
2.2 KB |
ppmwriter.cc |
3.9kB |
ppmwriter.h |
3.6 KB |
tensor3.cc |
1.6 KB |
tensor3.h |
1.4 KB |
Documentacion.html |
23.0 KB |
2.jpg |
6.5 KB |
mandel1.jpg |
17.0 KB |
compatible.html |
5.2 KB |
compatible132.html |
4.9 KB |
README |
1.4 KB |
pulse.gif |
70.0 KB |
logo.jpg |
8.9 KB |
Version History
| Date |
Version |
Comments |
14 July 2002 |
1.3.3 |
Made the PPM files more compatible with more programs, but less compatible with one (XView). See the compatibilities table. |
12 July 2002 |
1.3.2 |
Implemented 65535-colour binary files!! |
11 July 2002 |
1.3.1 |
Fixed a bug that caused images to be initialized to black, no matter what backgroundcolour was. (and finally fixed that flipped-image bug). |
7 July 2002 |
1.3.0 |
Added the read() function. |
6 July 2002 |
1.2.0 |
Fixed a major bug in the file-writing routine (your images are no longer rotated through 90 degrees...). |
1 July 2002 |
1.1.0 |
Added support for binary mode files. |
29 June 2002 |
1.0.0 |
Initial release. |
Nota: Las versiones antiguas las podras encontrar aqui
Comentarios, sugerencias, ayuda, etc:
----- i_n_d_i_v_i_d_u_a_l_6_1_[at]_y_a_h_o_o_._c_o_m_._a_r----- (omite los underscore _)
Terminos Legales, Licencia de Uso
Este software se proporciona "tal cual". Fue programado enteramente por mi (agradezco las muy utiles sugerencias de otras personas). Es libre de ser modificado, siempre que se incluya la documentacion original y se especifique que modificaciones se hicieron, por quien y en que momento EN TODOS LOS ARCHIVOS RELEVANTES ( .h, .cc y el Makefile, entre otros.). Tambien se le debera informar al autor original (yo) en caso de modificacion, para que este al tanto y yo vea la posibilidad de incluir la modificacion en alguna version futura de PPMWriter (reconociendo el aporte del contribuyente, por supuesto).
Ejemplo Simple
Este corto programa genera el punto verde que se ve en la esquina superior-derecha (agregue el recuadro rojo para que se distinguiera de que tamanio es la imagen).
Si el programa se llama circle.cc, y ppmwriter.cc, ppmwriter.h, tensor3.cc y tensor3.h se encuentran en el mismo directorio que el programa a compilar, basta tipear g++ circle.cc tensor3.cc ppmwriter.cc -o circle.
Tambien es posible hacer peliculas. Este es un ejemplo rapido y simple de esto: una imagen GIF animada, usando el programa anterior, pero automatizando el proceso de darle nombre a las imagenes ppm, y multiplicando la exponencial por un termino sinusoidal. Fueron convertidas con ppmtogif de ImageMagick. Tuve que reducir los el nivel de colores a 255 para poder usarlo con ImageMagick. Hasta ahora el mejor programa que he encontrado para imagenes PPM es XView. Abre todas las resoluciones y niveles de color.
Descripcion de las funciones:
Hay disponible una version imprimible en varios formatos de esta informacion, ya que el imprimir este archivo HTML directamente no es recomendable (fue escrito 100% a mano y por lo tanto utiliza texto invisible de formateo que si seria visible, sin embargo, sobre el fondo blanco de una hoja de papel-- si seleccionas todo el texto con el puntero seguramente veras a lo que me refiero...): Está disponible en la sección Downloads.
ppmwriter::ppmwriter(int width, int height, int backgroundcolour, int maxcolours, char * filename, bool bin);
ppmwriter::plot(int x, int y, int red, int green, int blue);
ppmwriter::read(int x, int y, int colour);
ppmwriter::clear();
ppmwriter::ppmwriter_rename(char * newname);
ppmwriter::close();
ppmwriter(int width, int height, int backgroundcolour, int maxcolours, char * filename, bool bin);
Este es el constructor. Nota que no hay un contructor sin argumentos!
Argumentos:
> int width --------------- Ancho de la imagen
> int height --------------- Altura de la imagen
> int backgroundcolour ---Numero entre 0 y maxcolours que sera el nivel de gris con que se inicializara la imagen (generalmente blanco o negro)
> int maxcolours --------- Numero que representara el nivel maximo de intensidad de un color dado (debe ser menor que 65535, y, para algunos programas,
alrededor de 30000)
> char * filename -------- Un array o puntero a un array donde este el nombre del archivo de salida que se quiere. (Util para generar el nombre
dinamicamente dentro del programa).
> bool bin ---------------- 1 si el archivo sera en modo binario, 0 si sera en modo ASCII.
void plot(int x, int y, int red, int green, int blue);
Con esta funcion se plotea un pixel a la imagen.
Argumentos:
> int x ---------------- Posicion en x del pixel
> int y ---------------- Posicion en y del pixel
> int red -------------- Intensidad de rojo, entre 0 y maxcolours.
> int green ------------ Intensidad de verde, entre 0 y maxcolours.
> int blue ------------- Intensidad de azul, entre 0 y maxcolours.
int read(int x, int y, int colour);
Con esta funcion se averigua de que color es el pixel x, y.
Argumentos:
> int x --------------- Posicion en x del pixel que se quiere mirar.
> int y --------------- Posicion en y del pixel que se quiere mirar.
> int colour ---------- Que coeficiente de color se quiere observar? rojo = 0, verde = 1, azul = 2.
void clear();
> Toda la imagen se resetea a negro
void ppmwriter_rename(char * newname);
Argumentos:
> char * newname ---------- Un array o puntero a un array con un nuevo nombre para el archivo en vez del usado en el constructor.
void close();
> Cierra y escribe al disco la imagen.
El archivo .tgz contiene un programa para probar la clase. Genera la imagen que se ve aqui. Si quieres generar la imagen de alguna version antigua, haz click aqui y baja esa version. Esta es la imagen que genera el programa incluido desde la version 1.2.0. (Nota importante: He visto como se ve esta imagen en un computador Windows y te puedo asegurar que la pesima calidad aparente es problema de la combinacion Windows/Explorer y no de la imagen en si-- en un Mac o una maquina Linux se ve genial!).