15. Formatos de ficheros de imágenes más habituales. Cómo leer imágenes desde ficheros.

Cuando se habla de imágenes creadas por ordenador, se suele distinguir entre dos grandes grupos :
  • Bitmap : (o mapa de bits). Un tipo de imágenes para ordenador, en las que se almacena información sobre los puntos que las componen y el color de cada punto. Esto supone que al ampliar la imagen no se gana en definición, sino que se ven "puntos gordos". 
  • Vectorial : Un tipo de imágenes para ordenador, en las que se almacena información sobre las líneas y figuras geométricas que las componen. Esto permite que no pierdan definición si se amplían, al contrario de lo que ocurre con las imágenes "Bitmap". 


También podríamos distinguir el caso de imágenes en 3 dimensiones, en las que además se indica (como mínimo) su situación en el espacio (la de cada elemento que la forma o la de uno que se toma como referencia, y también se pueden indicar los ángulos de rotación, las texturas que se le deben aplicar...). Es un caso bastante más complicado que lo que nos interesa por ahora, así que las trataremos más adelante.

En los juegos clásicos, se suelen usar imágenes Bitmap, y es enormemente frecuente que las imágenes no se creen "desde el programa", como hemos hecho hasta ahora, sino que se diseñan con un programa de manipulación de imágenes, se guardan en un cierto formato y desde nuestro programa nos limitamos a cargarlas y manipularlas.

Pues bien, los formatos de imagen Bitmap más habituales son:

  • JPG o JPEG: Es un formato comprimido, pero que PIERDE CALIDAD en la compresión. Se puede indicar el grado de compresión (o de calidad) que se desea, para conseguir un tamaño más pequeño o bien una mayor fidelidad al original.  Por ejemplo, una compresión del 15% (o una calidad del 85%) es un valor que permite imágenes con bastante calidad pero con un tamaño no muy grande.
  • GIF : Es un formato comprimido, que no puede mostrar más de 256 colores, pero que no pierde calidad en la compresión. También permite otras características "avanzadas", como incluir varias imágenes en un mismo fichero (muy utilizado para crear animaciones sencillas en Internet) o definir un color transparente (que no se dibujará en pantalla al mostrar la imagen, también muy usado en Internet). Como inconveniente adicional, es un formato que tiene copyright, por lo que algunas utilidades no permiten usarlo.
  • TIFF : Es un formato con que no pierde calidad y que se usa con frecuencia para intercambiar información entre ordenadores muy distintos (PC y Macintosh, por ejemplo) cuando se debe conservar toda la calidad de la imagen original. Existen distintas variantes, unas sin comprimir y otras comprimidas, pero aun así comprime la información mucho menos que el formato JPG.
  • BMP : Formato nativo de Windows. Permite desde imágenes en blanco y negro hasta "color auténtico", y existe también una variante sin comprimir y una variante comprimida (que, al igual que los TIFF, ocupa mucho más que el JPG).
Otros menos utilizados son, por ejemplo:
  • PCX : Formato diseñado por los creadores de Paintbrush (un programa de dibujo que se utilizó mucho en los tiempos de MsDos). Es comprimido, pero compacta la información menos que el formato GIF. Hoy en día este formato se usa poco, pero es un formato muy sencillo, por lo que es habitual encontrar bibliotecas de funciones para juegos que lo utilizan.
  • LBM : Es un caso muy similar. Se trata del formato usado por el antiguo programa de dibujo Deluxe Paint .
  • PNG : Diseñado como alternativa a GIF cuando los creadores de este formato decidieron cobrar royalties por su uso. Además incluye alguna mejora, como el soporte para imágenes de más de 256 colores.  Se utiliza en Internet, pero no está tan extendido como GIF.
  • TGA : Es un formato sencillo y que permite imágenes de una alta calidad (separa los componentes rojo, verde y azul de cada punto de la imagen) pero a cambio de ocupar mucho espacio en disco.
  • PSD : Formato nativo de Photoshop, uno de los programa de retoque de imágenes más utilizados (los ficheros no podrán ser visualizados desde muchas otras aplicaciones).
  • CPT : Formato nativo de Corel Photopaint, otro conocido programa de retoque (con el mismo inconveniente que el anterior).


En nuestro caso, tendremos cuenta que:

  • Es muy fácil usar ciertos tipos de ficheros cuando la plataforma (sistema operativo) los soporta directamente. Por ejemplo, casi cualquier compilador para Windows nos permitirá mostrar imágenes BMP de una forma muy sencilla.
  • Otros formatos muy frecuentes, como JPG o GIF no suelen estar tan soportados por la plataforma (cada día más), pero sí es fácil encontrar bibliotecas que se encarguen de ello por nosotros.
  • Finalmente, otros (como el PCX) son tan sencillos que nosotros mismos podríamos crear fácilmente las rutinas para mostrarlos.
  • En el caso de Allegro , la versión que estamos usando en este momento permite manejar imágenes en formato PCX, LBM, BMP y TGA.

15. Cómo leer imágenes desde ficheros. (*)

Vamos a empezar por centrarnos en el caso de Allegro. En la versión 4.0.2 podemos leer imágenes en formatos BMP, LBM, PCX y TGA usando

BITMAP *load_bmp(const char *nombreFich, RGB *paleta);
  (Para imágenes de 256 colores o color auténtico de 24 bits en formato BMP de Windows o de OS/2). 

BITMAP *load_lbm(const char *nombreFich, RGB *paleta);
  (Para imágenes de 256 colores en formato LBM).

BITMAP *load_pcx(const char *nombreFich, RGB *paleta);
  (Para imágenes de 256 colores o color auténtico de 24 bits en formato PCX).

BITMAP *load_tga(const char *nombreFich, RGB *paleta);
  (Para imágenes de 256 colores, color de alta densidad de 15 bits, color auténtico de 24 bits o color auténtico + transparencia de 32 bits en formato TGA).


y tenemos también una función genérica, que decide automáticamente qué tipo de fichero es, a partir de su extensión:

BITMAP *load_bitmap(const char *nombreFich, RGB *paleta);


Nosotros somos los responsables de comprobar que no ha habido ningún error (el puntero devolvería NULL), de destruir el BITMAP después de usarlo y de cambiar a un cierto modo gráfico antes de cargar la imagen o de indicar cómo se debe convertir los colores de la imagen a los de la pantalla con la orden "set_color_conversion( modo )", donde los modos son constantes con nombres:

COLORCONV_8_TO_24
COLORCONV_24_TO_8
COLORCONV_32_TO_24
COLORCONV_32A_TO_24
...

(en la documentación de Allegro están todos los valores posibles, aunque los nombres son igual de intuitivos que esos)

En el apartado 17 leeremos nuestras primeras imágenes.

Es menos habitual que un juego tenga que guardar imágenes (al menos a nuestro nivel actual), pero aun así, conviene comentar que también tenemos las funciones equivalentes (excepto para el LBM, que no podemos guardar):

int save_bmp(const char *nombreFich, BITMAP *bmp, const RGB *paleta);
int save_pcx(const char *nombreFich, BITMAP *bmp, const RGB *paleta);
int save_tga (const char *nombreFich, BITMAP *bmp, const RGB *paleta);

y la genérica

int save_bitmap(const char *nombreFich, BITMAP *bmp, const RGB *paleta);

En cualquier caso, devuelve un valor distinto de cero si hay algún error (no guardaremos imágenes todavía, pero sí las leeremos pronto... en el apartado 17).

(Información para Pascal y Java...Aun no disponible) (*)