|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Aug 2005
Messaggi: 23
|
[C] Estrazione componenti RGB
Salve a tutti!!
Ho un immagine 320x240 a 24bpp, quello che devo fare è estrarre le componenti RGB e disporre ognuna di queste su un'immagine differente. Ovviamente ogni pixel è formato da 3 byte ognuno dei quali rappresenta una delle 3 componenti (ordinate sempre RGB RGB RGB...) Quello che in pratica sto cercando di realizzare è un ciclo che prende il file raw e preleva (ad esempio per la componente R) i pixel partendo da zero e spostandosi di 3 in avanti per poi memorizzarli in un buffer...ovviamente non funziona Codice:
int rows,cols,;
unsigned char **img1,**imgR,**imgG,**imgB;
unsigned char** allocabuffer(int r, int c);
void eliminabuffer(unsigned char **buffer,int r);
void readraw(char *filepath,unsigned char **buffer);
void readrawR(char *filepath,unsigned char **buffer);
void readrawG(char *filepath,unsigned char **buffer);
void readrawB(char *filepath,unsigned char **buffer);
void saveraw(char *filepath,unsigned char **buffer);
FILE *out;
main()
{
int i;
rows=240; cols=320;
imgR=allocabuffer(rows, cols);
readrawR("Immagine.raw",imgR);
saveraw("Immagine_R.raw",imgR);
eliminabuffer(imgR,rows);
}
unsigned char** allocabuffer(int r, int c)
{
int i;
unsigned char **buffer=(unsigned char**)malloc(r*sizeof(unsigned char*));
for(i=0;i<r;i++)
buffer[i]=(unsigned char*)calloc(c,sizeof(unsigned char));
return (buffer);
}
// readraw RGB
void readrawR(char *filepath,unsigned char **buffer)
{
int i;
FILE *source=fopen(filepath,"rb");
for(i=0;i<rows*cols*3;i+3) fread(buffer[i],1,1,source);
fclose(source);
}
void readrawG(char *filepath,unsigned char **buffer)
{
int i;
FILE *source=fopen(filepath,"rb");
for(i=1;i<rows;i+3) fread(buffer[i],1,cols,source);
fclose(source);
}
void readrawB(char *filepath,unsigned char **buffer)
{
int i;
FILE *source=fopen(filepath,"rb");
for(i=2;i<rows;i+3) fread(buffer[i],1,cols,source);
fclose(source);
}
void eliminabuffer(unsigned char **buffer,int r)
{
int i;
for(i=0;i<r;i++) free(buffer[i]);
free(buffer);
}
void saveraw(char *filepath,unsigned char **buffer)
{
int i;
FILE *source=fopen(filepath,"wb");
for(i=0;i<rows;i++) fwrite(buffer[i],1,1,source);
fclose(source);
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Ho dato solo un'occhiata veloce e ho notato che il tuo ciclo non va avanti, hai scritto:
Codice:
for(i=0;i<rows*cols*3;i+3) |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Aug 2005
Messaggi: 23
|
Purtroppo ci dev'essere qualche altro problema perchè il programma continua a non funzionare...o meglio la finestra DOS non termina mai di lavorare...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
for(i=0;i<rows*cols*3;i+3)
Lo stesso errore c'è in due posti, hai editato anche nell'altro ? |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Aug 2005
Messaggi: 23
|
Si li ho corretti tutti ma in ogni caso nel main chiamo solo readrawR...
|
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Aug 2005
Messaggi: 23
|
Potrebbe essere un problema di buffer[i] ?
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In effetti via a sovrascrivere i puntatori allocati per i vari vettori... Prova lavorare su un vettore invece che su una matrice.
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Aug 2005
Messaggi: 23
|
Mi sa che non è possibile dato che in uscita ho bisogno di un'immagine-->matrice
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Un'immagine non è detto che sia una matrice...può essere un buffer e quindi un array.
Se prima accedevi così buffer[i][j], ad un vettore puoi accedere così: buffer[i*dim_riga + j]. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:44.


















