MinaVagante
18-02-2009, 12:45
Ciao a tutti
sto cercando di fare un programma che,da linea di comando riceve il nome di un immagine, e un numero intero N, e ne ingrandisce le dimensioni di N volte. Fin qui il programma funziona, ma adesso devo aggiungere un pezzo in modo tale da ridurre la quadrettatura, facendo una media per ogni pixel dei pixel adiancenti.
Questo è il programma che ho scritto:
#include<stdio.h>
#include<stdlib.h>
#include"bmp.h"
void ingrandisci(BITMAP bmpout,BITMAP bmpin,int N);
void riduci_quadrettatura(BITMAP bmpout,int N);
double calcola_media(BITMAP bmpout,int i,int j,int N,char colore);
int main(int argc, char *argv[])
{ BITMAP bmpin,bmpout;
FILE *fpin,*fpout;
int N;
if (argc != 3)
{ printf("Scrivere su linea di comando:
nome immagine ingresso
numero intero che rappresenta l'ingrandimento");
exit (EXIT_FAILURE);
}
if((fpin=fopen(argv[1],"rb"))==NULL)
{ printf("Errore apertura file ingresso");
exit (EXIT_FAILURE);
}
if((fpout=fopen("ingrandita.bmp","wb"))==NULL)
{ printf("Errore apertura file d'uscita");
exit (EXIT_FAILURE);
}
bmpin=ReadBitmap(fpin);
fclose(fpin);
bmpout=CreateEmptyBitmap(bmpin.height*atoi(argv[2]),bmpin.width*atoi(argv[2]));
ingrandisci(bmpout,bmpin,atoi(argv[2]));
printf("Sono qui");
riduci_quadrettatura(bmpout,atoi(argv[2]));
WriteBitmap(bmpout,fpout);
fclose(fpout);
ReleaseBitmapData(&bmpin);
ReleaseBitmapData(&bmpout);
return EXIT_SUCCESS;
}
void ingrandisci(BITMAP bmpout,BITMAP bmpin,int N)
{ int i,j,c=0,k,I,J;
for(i=0; i<bmpin.height; i++)
{ for(j=0; j<bmpin.width; j++)
{
for(k=i*N; k<=i*N+N-1; k++)
{
for(c=j*N; c<=j*N+N-1; c++)
{ PIXEL(bmpout,k,c)=PIXEL(bmpin,i,j);
}
}
}
}
return;
}
void riduci_quadrettatura(BITMAP bmpout,int N)
{ int i,j;
for(i=1; i<bmpout.height-1; i++)
{
for(j=1; j<bmpout.width-1; j++)
{ PIXEL(bmpout,i,j).red=calcola_media(bmpout,i,j,N,'r');
PIXEL(bmpout,i,j).green=calcola_media(bmpout,i,j,N,'g');
PIXEL(bmpout,i,j).blue=calcola_media(bmpout,i,j,N,'b');
}
}
return;
}
double calcola_media(BITMAP bmpout,int i,int j,int N,char colore)
{ double somma_rosso=0,somma_verde=0, somma_blu=0;
int c,k;
for(c=i; c<=i*N+N-1; i++)
{
for( k=j; k<= j*N+N-1; j++)
{
somma_rosso+=PIXEL(bmpout,c,k).red;
somma_verde+=PIXEL(bmpout,c,k).green;
somma_blu+=PIXEL(bmpout,c,k).blue;
}
}
if (colore == 'r')
return (double)somma_rosso/(N*N);
if (colore == 'g')
return (double)somma_verde/(N*N);
if (colore == 'b')
return (double)somma_blu/(N*N);
}
Non riesco a capire perchè il programma entri in un ciclo infinito :confused:
Allora, se io tolgo tutta la parte della quadrettatura il programma funziona, se io invece l'aggiungo, non mi scrive neanche quel "Sono qui" nel main, un printf che ho aggiunto per cercare di vedere dove il programma si bloccava. Ma come fa a non arrivare a quel punto se la funzione ingrandisci funziona??
Grazie a tutti
sto cercando di fare un programma che,da linea di comando riceve il nome di un immagine, e un numero intero N, e ne ingrandisce le dimensioni di N volte. Fin qui il programma funziona, ma adesso devo aggiungere un pezzo in modo tale da ridurre la quadrettatura, facendo una media per ogni pixel dei pixel adiancenti.
Questo è il programma che ho scritto:
#include<stdio.h>
#include<stdlib.h>
#include"bmp.h"
void ingrandisci(BITMAP bmpout,BITMAP bmpin,int N);
void riduci_quadrettatura(BITMAP bmpout,int N);
double calcola_media(BITMAP bmpout,int i,int j,int N,char colore);
int main(int argc, char *argv[])
{ BITMAP bmpin,bmpout;
FILE *fpin,*fpout;
int N;
if (argc != 3)
{ printf("Scrivere su linea di comando:
nome immagine ingresso
numero intero che rappresenta l'ingrandimento");
exit (EXIT_FAILURE);
}
if((fpin=fopen(argv[1],"rb"))==NULL)
{ printf("Errore apertura file ingresso");
exit (EXIT_FAILURE);
}
if((fpout=fopen("ingrandita.bmp","wb"))==NULL)
{ printf("Errore apertura file d'uscita");
exit (EXIT_FAILURE);
}
bmpin=ReadBitmap(fpin);
fclose(fpin);
bmpout=CreateEmptyBitmap(bmpin.height*atoi(argv[2]),bmpin.width*atoi(argv[2]));
ingrandisci(bmpout,bmpin,atoi(argv[2]));
printf("Sono qui");
riduci_quadrettatura(bmpout,atoi(argv[2]));
WriteBitmap(bmpout,fpout);
fclose(fpout);
ReleaseBitmapData(&bmpin);
ReleaseBitmapData(&bmpout);
return EXIT_SUCCESS;
}
void ingrandisci(BITMAP bmpout,BITMAP bmpin,int N)
{ int i,j,c=0,k,I,J;
for(i=0; i<bmpin.height; i++)
{ for(j=0; j<bmpin.width; j++)
{
for(k=i*N; k<=i*N+N-1; k++)
{
for(c=j*N; c<=j*N+N-1; c++)
{ PIXEL(bmpout,k,c)=PIXEL(bmpin,i,j);
}
}
}
}
return;
}
void riduci_quadrettatura(BITMAP bmpout,int N)
{ int i,j;
for(i=1; i<bmpout.height-1; i++)
{
for(j=1; j<bmpout.width-1; j++)
{ PIXEL(bmpout,i,j).red=calcola_media(bmpout,i,j,N,'r');
PIXEL(bmpout,i,j).green=calcola_media(bmpout,i,j,N,'g');
PIXEL(bmpout,i,j).blue=calcola_media(bmpout,i,j,N,'b');
}
}
return;
}
double calcola_media(BITMAP bmpout,int i,int j,int N,char colore)
{ double somma_rosso=0,somma_verde=0, somma_blu=0;
int c,k;
for(c=i; c<=i*N+N-1; i++)
{
for( k=j; k<= j*N+N-1; j++)
{
somma_rosso+=PIXEL(bmpout,c,k).red;
somma_verde+=PIXEL(bmpout,c,k).green;
somma_blu+=PIXEL(bmpout,c,k).blue;
}
}
if (colore == 'r')
return (double)somma_rosso/(N*N);
if (colore == 'g')
return (double)somma_verde/(N*N);
if (colore == 'b')
return (double)somma_blu/(N*N);
}
Non riesco a capire perchè il programma entri in un ciclo infinito :confused:
Allora, se io tolgo tutta la parte della quadrettatura il programma funziona, se io invece l'aggiungo, non mi scrive neanche quel "Sono qui" nel main, un printf che ho aggiunto per cercare di vedere dove il programma si bloccava. Ma come fa a non arrivare a quel punto se la funzione ingrandisci funziona??
Grazie a tutti