En una imagen el color de cada pÃxel se compone de la combinación en distintas proporciones de los tres colores básicos rojo, verde y azul y esta proporción va de 0 (falta de color) a 255 (cantidad máxima). El ordenador en este caso necesita 8 bits para poder representar el valor máximo, asà que cada pÃxel necesita 24 bits (3 bytes, uno por cada componente) para poder mostrarse en pantalla y digo todo esto porque para codificar el algoritmo será necesario trabajar a nivel de bit sustituyendo, cuando sea necesario, el bit más a la derecha (el menos significativo). El cambio de este bit supone una alteración del color imperceptible para el ojo humano (incluso alterando los tres componentes) ya que lo aumentará o disminuirá en una sola unidad.
Color sin modificar (R=0, G=0, B=255)
Color modificado (R=1, G=1, B=254)
El esquema para la ocultación serÃa el siguiente:
- Obtener el código ASCII del carácter.
- Pasar el número obtenido a binario con 8 bits.
- Recorrer los pÃxeles obteniendo el color RGB del pÃxel en cuestión.
- Pasar cada componente RGB a binario con 8 bits.
- Sustituir el último bit de cada componente por el 1º, 2º y 3º respectivamente del código ASCII en binario.
- Volver a pasar a decimal para poder asignar el color al pÃxel. Hay que tener en cuenta que se necesitarán tres pÃxeles como mÃnimo para ocultar un carácter (1 bit por componente de color, 3 bits por pÃxel).
- Volver a hacerlo todo otra vez con el siguiente carácter del texto.
Un ejemplo, vamos a ocultar la letra "a" y necesitamos tres pÃxeles, el primero rojo, el segundo verde y el tercero azul (el color es lo de menos).
El código ASCII correspondiente a la letra "a" es el 97 que en binario serÃa 01100001.
Esto mismo para el primer pÃxel es:
El color rojo es R = 255, G = 0, B = 0 que al pasarlo a binario quedarÃa
R = 11111111 G = 00000000 B = 00000000
Se cogen los tres primeros dÃgitos binarios del código ASCII de la letra 011 y se sustituyen en los componentes del color quedando
R = 11111110 G = 00000001 B = 00000001
o lo que es lo mismo R = 254, G = 1, B = 1
Se cambia el color anterior del pÃxel por este nuevo cuyo cambio es imperceptible y se vuelve a hacer todo el proceso con los otros dos pÃxeles y tener oculta la letra.
El color verde es R = 0, G = 255, B = 0
R = 00000000 G = 11111111 B = 00000000
Siguientes tres dÃgitos binarios del código ASCII de la letra 000
R = 00000000 G = 11111110 B = 00000000
R = 0, G = 254, B = 0
El color azul es R = 0, G = 0, B = 255
R = 00000000 G =00000000 B = 11111111
Dos últimos dÃgitos binarios del código ASCII de la letra 01
R = 00000000 G = 00000001 B = 11111111
R = 0, G = 1, B = 255
- Recorrer los pÃxeles.
- Obtener el color RGB del pÃxel en cuestión.
- Pasar cada componente RGB a binario con 8 bits.
- Coger el último bit de cada componente de color y guardarlo para ir formando el correspondiente número binario.
- Y asà hasta completar los 8 bits necesarios (ASCII extendido).
- Pasar el binario a decimal y convertirlo a carácter ASCII.
- Volver a hacerlo todo otra vez para el siguiente carácter del texto.
El pÃxel verde R = 0, G = 254, B = 0
R = 00000000 G = 11111110 B = 00000000
El último dÃgito de cada componente del color 000
El pÃxel azul R = 0, G = 1, B = 255
R = 00000000 G = 00000001 B = 11111111
El último dÃgito de los componentes rojo y verde 01
Unimos todos los datos binarios que hemos extraÃdo y obtenemos 01100001 que al pasarlo a decimal nos da el número 97 que, a su vez, referido al código ASCII equivale a la letra "a".
Notas:
1-. El recorrido de los pÃxeles supongo que se podrá hacer de otras formas más complicadas para que no sea tan evidente como ocultar el texto de la misma manera en que se leerÃa (de izquierda a derecha), pero eso se queda a elección del programador y de cuanto se quiera complicar.
2-. El formato de imagen mejor y con el que funciona todo sin problemas es, por su simpleza, el BMP (o cualquier formato que no modifique en lo más mÃnimo el color al guardarse en un archivo).
3-. En el tercer pÃxel solo utilizamos el rojo y el verde, el azul se podrÃa usar en el siguiente carácter que se vaya a ocultar o dejarlo sin utilizar.
[BOLSA DE TRABAJO]
Estas buscando trabajo, te gusta la programación y tienes conocimientos en PHP, JavaScript, Mysql, HTML entonces te podría interesar esta propuesta laboral. Clic aquí para ver puesto.