[C con Clase] Manipulación de imágenes

Zakariae El-Abdelouarti shanatorio en gmail.com
Jue Ago 27 20:57:16 CEST 2009


Hola Javier,

Lo importante no es tener una biblioteca para leer o escribir imágenes
en un formato, si no saber
como está organizado el formato en si.

Por ejemplo para meter un mensaje en un archivo en formato JPEG (en
realidad el formato se llama
JFIF) te recomiendo que leas el siguiente artículo:

http://en.wikipedia.org/wiki/JPEG_File_Interchange_Format

En la sección que indica "File format structure" está indicada la
relación de bytes que tiene que haber
en una cabecera JFIF. Es MUY IMPORTANTE no manipular esa cabecera, ya
que en otro caso la propiedad
principal de la Esteganografía se perdería (se notaría que la imagen
ha mutado porque ya no seríe tal imagen).

Una vez que estás situado en la parte del archivo que corresponde a
los bytes de imagen es cuando empezarías
a escribir de byte en byte (char) o de word en word (short int).

Yo hice un programa que ocultaba un mensaje en una imagen de formato
JFIF de la siguiente manera.

Primero pasaba 21 KiloBytes (esto fue impuesto por el enunciado de la
práctica) del archivo, con lo que estaba
seguro de que no escribía en la cabecera. Después escribía dos bits en
cada dos bytes de la imagen, de la
siguiente manera (ESPERO QUE LO VEAS BIEN):

Byte de mensaje:
                                             x7 x6 x5 x4   x3 x2 x1 x0

                                                              |    |
 |    |

                      _________________|    |    |    |

                     |                                             |
 |    |

                     |   __________________|    |    |

                     |   |
 |    |

                     |   |                      __________ |   |

                     |   |                      |    __________|

                     |   |                      |    |
Bytes de imagen codificada:                        ???? ??x7x6    ????
??x5x4 ...........................................................

     ^^^^^^^^^^^^^
                                               _________________|
                                 ______|______
En cada grupo de 16 bits (2 bytes) yo introducía dos bits en la parte
de menos peso, para que así no se notara a la hora de ver la imagen.

Yo no estoy seguro que la cabecera de un fichero JFIF sea de 21KB, ya
que en el artículo que yo te he mandado deja muy claro que la
parte donde se guarda el "Thumbnail" es variable (3 x tw x th).

Esta forma de hacer las cosas me funcionó con algunas imágenes y no con otras.

PD: Quizá la librería libjpeg/libpng pueda ayudarte, pero yo no se
nada sobre la misma:
http://en.wikipedia.org/wiki/Libjpeg

http://www.ijg.org/

http://www.libpng.org/pub/png/libpng.html

http://en.wikipedia.org/wiki/Libpng

Espero que esto te guíe un poco, y si tienes más preguntas no dudes en
realizarlas.

Saludos.

Zaka.




Más información sobre la lista de distribución Cconclase