PDA

View Full Version : [C] Ingrandimento immagine, dove si blocca il programma??


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

PGI-Bis
18-02-2009, 12:52
for( k=j; k<= j*N+N-1; j++)

Non sarebbe meglio k++?

MinaVagante
18-02-2009, 12:53
si si già modificato era la versione vecchia questa, anche il c sopra :D
non va comunque

MinaVagante
18-02-2009, 13:08
Inoltre come è possibile che una parte una funzione venga correttamente completata, e dopo, con l'aggiunta di un altro pezzo di programma, che non la utilizza, non arriva allo stesso punto di prima???:confused:

MinaVagante
18-02-2009, 19:57
Aiuto nessuno???
Non riesco proprio a capire dove sbaglio:mc:

Kenger
18-02-2009, 20:18
Se non posti anche bmp.h difficilmente qualcuno avrà voglia di guardare del codice non eseguibile. ^^

MinaVagante
18-02-2009, 20:26
si allora qui:
http://web.diegm.uniud.it/pierluca/public_html/teaching/fondamenti_II/doc/esercitazioni/B07_codifica_delle_immagini/bmplib/
ci sono le librerie fatte dal mio professore.
Però non riesco a capire perchè se tolgo la parte di riduci_quadrettatura il programma funziona correttamente, mentre se aggiungo, non stampa a video il printf Sono qui, che sta immediatamente dopo alla funzione ingrandisci

eliano
19-02-2009, 00:56
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

E' possibile che mi sbagli, data l'ora tarda, ma credo che per accedere alle tre componenti diel colore tu debba usare l'indirezione: infatti la dichiarazione di BITMAP è

typedef struct tagBITMAP
{
dword width;
dword height;
COLORTRIPLE *pixel;
FILEHEADER fileheader;
BMPHEADER bmpheader;
} BITMAP;

MinaVagante
19-02-2009, 07:57
Intendi che non devo scrivere:
PIXEL(bmpout,i,j).red=PIXEL(bmpin,i,j).red
ad esempio???
Perchè ho fatto altri programmi in cui assegnavo il valore per ciascun colore e tutto funziona, come questo ad esempio in cui dovevo modificare la luminosità:
#include<stdio.h>
#include<stdlib.h>

#include "bmp.h"

BITMAP modifica_luminosita(BITMAP bmpin,float k);


int main(int argc, char *argv[])
{ float k;
BITMAP bmpin,bmpout;
FILE *fpin,*fpout;

if(argc != 3)
{ printf("Scrivere sulla linea di comando:
nome file ingresso
numeroreale (fattore di cambiamento luminosti…)");
exit (EXIT_FAILURE);
}

if((fpin=fopen(argv[1],"rb"))==NULL)
{ printf("Errore apertura file d'ingresso.");
exit (EXIT_FAILURE);
}

if((fpout=fopen("Luminosit…_modificata.bmp","wb"))==NULL)
{ printf("Errore nell'apertura file d'uscita");
exit (EXIT_FAILURE);
}

k=atof(argv[2]);
bmpin=ReadBitmap(fpin);

bmpout=modifica_luminosita(bmpin,k);

WriteBitmap(bmpout,fpout);

ReleaseBitmapData(&bmpin);
ReleaseBitmapData(&bmpout);

fclose(fpin);
fclose(fpout);

return EXIT_SUCCESS;

}


BITMAP modifica_luminosita(BITMAP bmpin,float k)
{ int i,j;
BITMAP bmpout;
COLORTRIPLE white={255,255,255};

bmpout=CreateEmptyBitmap(bmpin.height,bmpin.width);

for(i=0; i<bmpin.height; i++)
{ for(j=0; j<bmpin.width; j++)
{ if ( (PIXEL(bmpout,i,j).red=PIXEL(bmpin,i,j).red * k/100 > 255)||
(PIXEL(bmpout,i,j).green=PIXEL(bmpin,i,j).green * k/100 >255)||
(PIXEL(bmpout,i,j).blue=PIXEL(bmpin,i,j).blue * k/100 > 255))
{ PIXEL(bmpout,i,j)=white;
}
else
{ PIXEL(bmpout,i,j).red=PIXEL(bmpin,i,j).red *k/100;
PIXEL(bmpout,i,j).green=PIXEL(bmpin,i,j).green * k/100;
PIXEL(bmpout,i,j).blue=PIXEL(bmpin,i,j).blue * k/100;
}
}
}
return bmpout;

}

eliano
19-02-2009, 10:39
Scusami, errore mio: avevo interpretato male la struttura.