Ejercicio obligatorio 3

Fecha de entrega: Lunes 23 de noviembre

Introducción

Queremos modelar una imagen de tipo netpbm, para ello definimos la estructura:

typedef struct {
    pixel_t **lienzo;
    size_t ancho, alto;
} imagen_t;

que permite almacenar en memoria una imagen según el siguiente esquema:

../_images/20202_ej3.png

Trabajo

Creación y destrucción

Se pide implementar la función auxiliar imagen_t *_imagen_crear(size_t ancho, size_t alto); que genere la memoria necesaria para almacenar una imagen de ancho x alto píxeles. Los píxeles no deben ser inicializados. La función debe devolver la imagen creada o NULL en caso de falla.

Se pide implementar la función void imagen_destruir(imagen_t *imagen); que libere la memoria asociada a la imagen previamente creada.

Lectura y escritura

Implementar la función imagen_t *imagen_leer_stdin(); que cargue una imagen PGM desde stdin y la devuelva.

Implementar la función void imagen_escribir(const imagen_t *imagen); que imprima la imagen por stdout según el formato PGM.

Recorte

Implementar la función imagen_t *imagen_recortar(const imagen_t *imagen, size_t x0, size_t y0, size_t ancho, size_t alto); que reciba una imagen y devuelva una nueva imagen que consista en el recorte del rectángulo con esquina (x0, y0) y de tamaño ancho x alto. Si parte del rectángulo se escapara de la imagen deberá ajustarse a la intersección con la misma. Si luego del ajuste el rectángulo quedara vacío la función deberá fallar.

../_images/20202_ej3_2.png

Clonación

Haciendo uso de la función anterior implemente en una línea la función imagen_t *imagen_clonar(const imagen_t *imagen); que retorne una copia de la imagen en memoria nueva.

Aplicación y validación

Se provee el código fuente de la función main() que realiza llamadas a cada una de estas funciones. Dicha función debe ser la que se entregue como parte del trabajo sin efectuarle modificaciones de ningún tipo.

Además se entregan las salidas resultantes de correr el programa con los archivos de entrada del EJ2.

Tanto el main() requerido como los archivos de pruebas pueden ser descargados de acá archivos_20202_ej3.tar.gz

Para testear el recorte, tomar en cuenta que la imagen gatito3_entrada.pgm es más sencilla dado que el area a recortar entra completa en la imagen. La imagen gatito1_entrada.pgm recorta contra un eje mientras que gatito2_entrada.pgm recorta en ambos.

Entrega

Deberá entregarse el código fuente del programa desarrollado.

El programa debe:

  1. Compilar correctamente con los flags:

    -Wall -Werror -std=c99 -pedantic
    
  2. pasar Valgrind correctamente,

  3. validar los ejemplos dados.

La entrega se realiza a través del sistema de entregas.

El ejercicio es de entrega individual.