Capítulo 5 Conversiones de formato

Disponemos de varias funciones para cambiar el formato de las imágenes, aumentando o disminuyendo la profundidad de bits.

Una vez cargada una imagen en memoria, podemos modificar el formato de bits para cada pixel aplicando las funciones disponibles. El comportamiento de estas funciones es diferente si implica un aumento o una disminución de bits o si el mapa de bits original es en escala de grises o monocromo.

Convertir a un bit

Las imágenes en las que cada pixel se codifica mediante un bit se denominan monocromáticas.

Loros en color
Imagen en color
Loros B/W
Imagen B/W

FreeImage nos proporciona la función FreeImage_Dither para convertir cualquier imagen a monocromo. En este tipo de imágenes los colores se sustituyen por tramas de bits para simular diferentes todos de gris. Es por eso que esta función requiere dos parámetros. El primero es un puntero a la estructura FIBITMAP que contiene la imagen a convertir, y el segundo define el método que se usará para crear la trama de puntos. Estos métodos se pueden seleccionar mediante las constantes definidas en la tabla 8.

Como el tamaño del mapa de bits no cambia, estas conversiones implican pérdida de resolución. Cada pixel no se convierte en una trama, sino que se trabaja con conjuntos de pixels para obtener cada unidad de la trama.

Los métodos Bayer son tramas de puntos con diferentes densidades, dependiendo del color, como en el primer ejemplo.

Loros B/W Cluster
Imagen B/W Cluster

Los métodos Cluster se usan en impresión, y eran muy habituales en imágenes de prensa escrita. Cada elemento de la trama es un cuadrado con más o menos parte negra y blanca, dependiendo del tono, pero no hay dispersión, sino que las dos pates están claramente separadas, como se muestra en segundo ejemplo.

Convertir a un bit, con umbral

Loros B/W con umbral
Imagen B/W con umbral

La función FreeImage_Threshold convierte la imagen dada como primer parámetro a una imagen monocromo mediante un umbral indicado en el segundo parámetro. Para ello primero se convierte la imagen a una escala de grises de 8 bits, y posteriormente, cualquier pixel con un valor de brillo menos al umbral se convierte a cero (negro), y el resto a 1 (blanco).

Esta conversión es la única monocromática que no implica pérdida de resolución, es decir, cada pixel en la imagen original se convierte en un pixel blanco o negro.

Convertir a cuatro bits

Loros 4 bits
Imagen 4 bits

La función FreeImage_ConvertTo4Bits convierte la imagen dada como parámetro a una imagen en escala de grises de cuatro bits.

El resultado será un mapa de bits en escala de grises.

Convertir a ocho bits

Loros 8 bits
Imagen 8 bits

La función FreeImage_ConvertTo8Bits convierte la imagen dada como parámetro a una imagen en escala de grises de ocho bits.

Para calcular el valor de gris de cada pixel se usa la fórmula conocida como Rec. 709):

gris = (0.2126 x Rojo + 0.7152 x Verde + 0.0722 x Azul)

La función FreeImage_ConvertToGreyscale hace lo mismo, pero usa una rampa lineal en lugar de la fórmula Rec. 709. Esto funciona mejor con imágenes con paleta de 1, 4 y 8 bits, así como con imágenes con el tipo de color FIC_MINISWHITE.

También se pueden convertir imágenes de 24 y 32 bits a ocho bits en color. Para ello usaremos la función FreeImage_ColorQuantize, esto crea imágenes de ocho bits con paleta de colores.

La función admite un segundo parámetro para especificar el método de cuantificación de colores, según la tabla 7.

También disponemos de la función FreeImage_ColorQuantizeEx, que permite elegir el número de colores de la imagen de salida.

Convertir a dieciséis bits

Gato 24 bits
Imagen 24 bits
Gato 16 bits
Imagen 16 bits

Los mapas de bits de dieciséis bits no tienen paleta, sino que codifican cada componente de color usando bits. Como dieciséis no es múltiplo de tres, disponemos de cinco bits para cada componente, y sobraría un bit. Pero hay otra alternativa, y es usar el bit sobrante para añadir un bit a uno de los componentes.

Existen dos tipos de imágenes de dieciséis bits: una usa cinco bits por componente y la otra usa cinco para el rojo y azul y seis para el verde.

FreeImage nos proporciona dos funciones para convertir imágenes a dieciséis bits: FreeImage_ConvertTo16Bits555 y FreeImage_ConvertTo16Bits565, respectivamente.

Convertir a veinticuatro o treintaidos bits

Finalmente, para mapas de bits estándar disponemos de dos funciones para convertirlos a veinticuatro o treintaidos bits.

A 24 bits usando FreeImage_ConvertTo24Bits y a 32 bits usando FreeImage_ConvertTo32Bits.

Existen otras funciones de conversión, pero se aplican a mapas de bits no estándar.

Ejemplo 7

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 7 FreeImage007.zip 2023-04-26 1625 bytes 196