lunes, 13 de agosto de 2012

ElBaúlDelProgramador - Detectar archivos PNG con C++

El Baúl del Programador

ElBaúlDelProgramador - Detectar archivos PNG con C++

Link to El Baúl del Programador

Detectar archivos PNG con C++

Posted: 12 Aug 2012 03:02 PM PDT

Hace un tiempo trasteando con una librería que nos proporcionaron en la facultad para leer imágenes PGM y PPM, me propuse añadirle la capacidad de leer, o al menos detectar imágenes PNG.

Por supuesto existen librerías que ya hacen este trabajo, como libpng, pero quise intentarlo con fines didácticos. Y lo comparto con vosotros.

El código solo detecta si la imagen es PNG, no implementé la lectura de la imagen en sí ya que hay que tener muchos factores en cuenta (transparencia, color de fondo, corrección Gamma, histograma etc).

Veamos primero el .h:

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99  100  101  102  103  104  105  
/**    * @file imagenES.h    * @brief Fichero cabecera para la E/S de imágenes    *    * Permite la E/S de archivos de tipos PGM,PPM    *    */     #ifndef _IMAGEN_ESP_H_  #define _IMAGEN_ESP_H_  /**    * @brief Tipo de imagen    *    * Declara una serie de constantes para representar los distintos tipos    * de imágenes que se pueden manejar.    *    * @see LeerTipoImagen    */  enum TipoImagen {IMG_DESCONOCIDO, ///< Tipo de imagen desconocido                   IMG_PGM,         ///< Imagen tipo PGM                   IMG_PPM,         ///< Imagen tipo PPM                   IMG_PNG		  ///< Imagen PNG  				};        /**    * @brief Consulta el tipo de imagen del archivo y sus dimensiones    *    * @param nombre indica el nombre del archivo de disco a consultar    * @param filas Parámetro de salida con las filas de la imagen.    * @param columnas Parámetro de salida con las columnas de la imagen.    * @return Devuelve el tipo de la imagen en el archivo    *    * @see TipoImagen    */  TipoImagen LeerTipoImagen(const char nombre[], int& filas, int& columnas);     /**    * @brief Lee una imagen de tipo PNG sobre memoria reservada    *    * @param nombre nombre del archivo a leer    * @param filas Parámetro de salida con las filas de la imagen.    * @param columnas Parámetro de salida con las columnas de la imagen.     * @return si ha  tenido éxito en la lectura    */  bool LeerImagenPNG (const char nombre[], int& filas, int& columnas);     /**    * @brief Lee una imagen de tipo PPM sobre memoria reservada    *    * @param nombre nombre del archivo a leer    * @param filas Parámetro de salida con las filas de la imagen.    * @param columnas Parámetro de salida con las columnas de la imagen.    * @param buffer Zona de memoria para obtener el valor de cada uno de los píxeles    * como tripletas consecutivas en formato RGB (RGBRGBRGB...) por filas    * desde la esquina superior izqda a la inferior drcha.     * @return si ha  tenido éxito en la lectura    * @pre buffer debe ser una zona de memoria suficientemente grande como para    * almacenar @a filas x @a columnas x 3  * bytes de datos de la imagen.    */  bool LeerImagenPPM (const char nombre[], int& filas, int& columnas, unsigned char buffer[]);     /**    * @brief Escribe una imagen de tipo PPM    *    * @param nombre nombre del archivo a escribir    * @param datos punteros a los @a f x @a c x 3 bytes que corresponden a los valores    *    de los píxeles de la imagen en formato RGB.    * @param f filas de la imagen    * @param c columnas de la imagen    * @retval true si ha tenido éxito en la escritura.    * @retval false si se ha producido algún error en la escritura.    */  bool EscribirImagenPPM (const char nombre[], const unsigned char datos[], int f, int c);     /**    * @brief Lee una imagen de tipo PGM sobre memoria reservada    *    * @param nombre nombre del archivo a leer    * @param filas Parámetro de salida con las filas de la imagen.    * @param columnas Parámetro de salida con las columnas de la imagen.    * @param buffer Zona de memoria para obtener el valor de cada uno de los píxeles    * como un valor de gris desde la esquina superior izqda a la inferior drcha.     * @return si ha  tenido éxito en la lectura    * @pre buffer debe ser una zona de memoria suficientemente grande como para    * almacenar @a filas x @a columnas bytes de datos de la imagen.    */  bool LeerImagenPGM (const char nombre[], int& filas, int& columnas, unsigned char buffer[]);     /**    * @brief Escribe una imagen de tipo PGM    *    * @param nombre nombre del archivo a escribir    * @param datos punteros a los @a f x @a c bytes que corresponden a los valores    *    de los píxeles de la imagen de grises.    * @param f filas de la imagen    * @param c columnas de la imagen    * @retval true si ha tenido éxito en la escritura.    * @retval false si se ha producido algún error en la escritura.    */  bool EscribirImagenPGM (const char nombre[], const unsigned char datos[], int f, int c);     

No hay comentarios:

Publicar un comentario

Sigue todas las entradas por email