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:
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.
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:
Compilar correctamente con los flags:
-Wall -Werror -std=c99 -pedantic
pasar Valgrind correctamente,
validar los ejemplos dados.
La entrega se realiza a través del sistema de entregas.
El ejercicio es de entrega individual.