Está en la página 1de 3

#include <stdio.

h>
#include <stdlib.h>
#include <string.h>

#define N 100
#define MAXCAD 200

/* Funci�n cargar: abrir� el fichero (que ser� de formato byn) y lo usar� para
inicializar
con el mismo una matriz entera N x N (excepto si la imagen que contiene el fichero
tiene
m�s de N filas o columnas). La funci�n recibir� como par�metros:
- Una cadena con el nombre del fichero (nomfich)
- Una matriz entera 100 x 100 (imagen)
- Dos par�metros enteros por referencia (filas y columnas). La funci�n debe
inicializarlos
con el n�mero de filas y columnas de la imagen que carga.

Si la funci�n puede cumplir con su cometido sin problemas devolver� 0. Si la


funci�n encuentra
alg�n problema con el fichero devolver� 1. Si el n�mero de filas o columnas de la
imagen del
fichero es mayor que 100 devolver� 2.
*/
int cargar(char nomfich[], int imagen[N][N], int *filas, int *columnas)
{
FILE *f;
int i, j, nf, nc;

f=fopen(nomfich, "r");
if (f==NULL) return 1;

fscanf(f,"%d%d",&nf,&nc);
if (nf>100 || nc>100) {
fclose(f);
return 2;
}

for (i=0; i<nf; i++)


for (j=0; j<nc; j++)
fscanf(f, "%d", &imagen[i][j]);

fclose(f);
*filas = nf;
*columnas = nc;
return 0;
}

/* funci�n que permitir� invertir una imagen. La funci�n recibir� una matriz con
una
imagen en formato byn y el n�mero de filas y columnas de dicha matriz. Para
invertir
la imagen lo que har� la funci�n ser� cambiar los p�xeles que son 1 por 0 y los que

son 0 por 1.*/


void invertir(int imagen[N][N], int filas, int columnas)
{
int i, j;
for (i=0; i<filas; i++)
for (j=0; j<columnas; j++)
if (imagen[i][j]==1)
imagen[i][j] = 0;
else
imagen[i][j] = 1;
//imagen[i][j] = (imagen[i][j]+1) % 2; /* esto con un if ser�a
m�s f�cil de ver */
}

/* La funci�n reducir recibir� los siguientes par�metros:


- Una matriz de enteros, origen.
- Dos valores enteros filas y columnas.
- Una matriz de enteros, destino.
origen es una matriz de unos y ceros (almacena una imagen byn). filas y columnas
indican el
tama�o de la matriz origen.
La funci�n no modificar� la matriz origen y devolver� 0 si el n�mero de filas o
columnas no es par.
Devolver� 1 en otro caso.
Rellenar� la matriz destino a partir de la reducci�n de la matriz origen: Si el
n�mero de filas
y columnas es par, la funci�n coger� los p�xeles en cuadrados 2x2: p�xeles (x,y),
(x,y+1),
(x+1,y), (x+1,y+1), donde x e y son pares (asumiendo que el p�xel superior
izquierda es el (0,0))
y transformar� los p�xeles de ese cuadrado de la siguiente forma:
- Si 3 p�xeles son blancos (1), cambiar� el otro p�xel a blanco (1).
- Si 3 p�xeles son negros (0), cambiar� el otro p�xel a negro (0).
- Si hay dos p�xeles blancos y dos negros, pondr� los cuatro p�xeles al mismo
color que tenga
el p�xel que est� en la posici�n superior izquierda del cuadrado.
*/
int reducir(int origen[N][N], int filas, int columnas, int destino[N][N])
{
int i, j, suma, color;

if (filas%2 || columnas%2) return 0;

for (i=0; i<filas; i+=2)


for (j=0; j<columnas; j+=2)
{
suma = origen[i][j]+origen[i+1][j]+origen[i][j+1]+origen[i+1]
[j+1];

if (suma>=3) color = 1;
else if (suma<=1) color = 0;
else color=origen[i][j];

destino[i][j]=color;
destino[i+1][j]=color;
destino[i][j+1]=color;
destino[i+1][j+1]=color;
}

return 1;
}
/* funci�n que muestra por pantalla una imagen */
void mostrar(int imagen[N][N], int filas, int columnas)
{
int i, j;
printf("\n");

for (i=0; i<filas; i++){


for (j=0; j<columnas; j++)
printf("%d ", imagen[i][j]);
printf("\n");
}
}

int main()
{
char nf1[MAXCAD]="ejemplo.byn";
int img[N][N], img2[N][N], f, c, res;
res = cargar(nf1, img, &f, &c);
if (res>0)
{
printf("Error cargando %s", nf1);
return -1;
}

/* comprobemos que se carga bien */


printf("Imagen cargada:\n");
mostrar(img, f, c);

invertir(img, f, c);

printf("\n\nImagen invertida:\n");
mostrar(img, f, c);

reducir(img, f, c, img2);

printf("\n\nImagen reducida:\n");
mostrar(img2, f, c);

return 0;
}