Una imagen en el mundo digital está compuesta por muchos puntos o píxeles individuales (abreviatura de elementos de imagen ). Conceptualmente, una imagen consiste en una matriz bidimensional de píxeles, pero en la práctica, esa estructura de fila y columna bidimensional es impuesta por el software que se ocupa de la imagen, por lo que si mira en la memoria verá solo una secuencia de píxeles
Entonces, ¿cómo se representan los píxeles en binario? Depende del tipo de imagen que estamos tratando:
- Si la imagen está compuesta exclusivamente de píxeles en blanco y negro , entonces podemos representar cada píxel utilizando solo un bit (dígito binario). Ese dígito es 0 o 1, apagado o encendido, correspondiente a blanco o negro. Una imagen, entonces, sería una secuencia de bits, donde cada bit representa un píxel de la imagen.
- Si la imagen es en escala de grises y contiene varios tonos de gris, necesitamos más bits para representar cada píxel. Por ejemplo, si necesitáramos 256 valores de escala de grises individuales que van desde negro (0) a blanco (255), necesitaríamos ocho bits (un byte) para representar cada píxel. Los valores entre 0 y 255 representarían varios tonos de gris. Si necesitáramos representar tonos de gris más distintos, simplemente usaríamos más bits para representar cada píxel.
- Si la imagen está en color , de alguna manera necesitamos representar el color exacto de cada píxel. Hay muchas maneras de hacer esto, pero consideremos un enfoque popular: representar la combinación de rojo, verde y azul para llegar al color que nos interesa. Nos referimos a esto como una estructura RGB, en la que tiene algunos bits que representan cuánto rojo (R) hay en el píxel, cuánto verde (G) hay en el píxel y cuánto azul (B) hay en el píxel. Estos tres componentes (o canales de color) se mezclan para representar un color específico. Podríamos asignar un byte para el rojo (256 niveles de rojo), un byte para el verde (256 niveles de verde) y un byte para el azul (256 niveles de azul). Un píxel en el que R es 255, G es 0 y B es 0 aparecería rojo, sin azul ni verde. Un píxel en el que R es 255, G es 165 y B es 0, aparecería naranja, una mezcla de rojo y verde, pero no azul. Un píxel en el que todos los canales R, G y B contienen el mismo valor representaría un tono de gris (donde todos los colores componentes contribuyen igualmente al color final). Si necesitamos representar más colores, solo usamos más bits para cada uno de los tres canales. Entonces, al menos en estos días, cada píxel en una imagen en color está compuesto por múltiples bytes, donde esos bytes juntos representan el color del píxel. (Existen otros enfoques para la representación del color. Esto es solo un ejemplo).
- Si la imagen en color admite transparencia , entonces necesitamos agregar algo conocido como un canal alfa , para indicar la opacidad del píxel. Nuevamente, hay varias formas de representar esto, pero si estamos usando una representación de color RGB, entonces, para el soporte de transparencia, usaríamos una representación RGBA, donde A representa el canal alfa. El valor numérico en el componente A de un píxel RGBA indica qué tan transparente aparecerá el píxel. Entonces, cada píxel en una imagen en color con transparencia está formado por múltiples bytes, donde esos bytes juntos representan el color y la transparencia del píxel.
Hay muchos formatos de archivo de imagen diferentes, y dentro de cada formato, a menudo hay muchas opciones sobre cómo se representan los píxeles, cuántos bits o bytes representan cada píxel, cuántos bits o bytes representan transparencia, cómo se comprime la información, si El formato admite transparencia y una amplia variedad de otras opciones. El archivo de imagen en sí generalmente contiene un montón de información al principio (conocida como encabezado ), que contiene información sobre la imagen (ancho, alto, representación de color, etc.). Esta sección de encabezado del archivo suele ir seguida de los datos de píxeles reales. Pero muchos formatos de archivo de imagen son mucho más complejos que esto, para admitir una amplia variedad de opciones.
- No soy bueno con los algoritmos y no puedo encontrar una solución hasta que alguien me lo diga. ¿Cómo puedo arreglar esto?
- ¿Por qué no hay implementación de montón de Fibonacci en la API Java estándar?
- ¿Cuál es el algoritmo más adecuado para la agrupación en una red social?
- Cómo averiguar si existen dos elementos en una matriz ordenada cuya suma es igual a algún número predefinido
- ¿Cómo construir un algoritmo hash? ¿Dónde puedo aprender más?
Una vez que la imagen se carga en la memoria, y tiene la información de ancho y alto, básicamente se trata de un montón de píxeles. Cómo se representan esos píxeles en binario depende del tipo de imagen y las convenciones utilizadas, como se describe anteriormente.
Los códigos ASCII proporcionan esencialmente una convención para permitir la representación de caracteres de texto utilizando valores binarios. ASCII es solo uno de esos esquemas de codificación que representa caracteres; hay otros. Mientras el software que escribe archivos que contienen los datos de texto y el software que lee y procesa esos datos concuerdan con el esquema de codificación, todo está bien. Del mismo modo, las imágenes se representan convencionalmente mediante valores binarios que describen un conjunto de píxeles, y hay una variedad de formas de representar esos píxeles. Mientras el software que escribe los archivos que contienen los datos de píxeles y el software que lee y procesa esos datos coinciden en el esquema de codificación, todo está bien.