PDA

View Full Version : [C]Ingrandimento Immagine Bitmap 24bit


mx92
19-05-2012, 09:31
Salve a tutti sto svolgendo un esercizio sui file binari che consiste nell'effettuare delle modifiche (capovolgimento, ingrandimento ecc.) su delle immagini bitmap a 24bit.
Mentre per operazioni come il capovolgimento fila tutto liscio quando vado ad ingrandire non riesco a capire il perchè l'immagine risulta ingrandita ma sfasata.

Posto il codice delle funzioni che svolgono l'ingrandimento:
PS: il metodo che uso per l'ingrandimento è l'interpolazione bilineare



void ingrandisci(FILE *s, char *n)
{
FILE *d;
unsigned char ***mat, ***mat_2;
int a,l;
int i, j, s1,s2,k;
char scala;
int somma[3];
char str[80];

str[0] = '\0';

printf("Di quanto ingrandiamo? Risposta: ");
scanf("%d", &scala);

mat = carica_mat(&a,&l,s);

strcat(str,"(Ingrandita)");
strcat(str,n);

d = fopen(str, "wb");

a *= scala;
l *= scala;

mat_2 = alloca(a,l);

for(i = 0; i < (a/scala)-2; i++)
for(j = 0; j < (l/scala)-2 ; j++)
for(k = 0; k < 3; k++)
{
somma[k] = 0;
for(s1 = 0; s1 < 2; s1++)
for(s2 = 0; s2 < 2; s2++)
somma[k] += mat[i+s1][j+s2][k];
somma[k] /= 4;

for(s1 = 0; s1 < 2; s1++)
for(s2 = 0; s2 < 2; s2++)
mat_2[(i*scala)+s1][((j*scala)+s2)][k] = somma[k];
}

scrivi_file(d,s,mat_2,a,l);

printf("Ingrandimento a %dx effettuato!!\n", scala);

return;
}

unsigned char ***alloca(int r, int c)
{
int i,j;
unsigned char ***m;

m = malloc(r*sizeof(char*));

for(i = 0; i < r; i++)
{
m[i] = malloc(c*sizeof(char*));
for(j = 0; j < c; j++)
m[i][j] = malloc(3*sizeof(char));
}



return m;
}

unsigned char ***carica_mat(int *r, int *c, FILE *f)
{
int i, j,k;
unsigned char ***m;
int a;

dim_imm(f, r, c);
m = alloca(*r, *c);

fseek(f, 1078, SEEK_SET);

for(i = 0; i < *r; i++)
{
for(j = 0; j < *c; j++)
for(k = 0; k < 3; k++)
fread(&m[i][j][k], sizeof(char),1,f);
}

return m;
}

void dim_imm(FILE *f, int *r, int *c)
{

rewind(f);
fseek(f, 18, SEEK_CUR);

fread(c, sizeof(int), 1, f);
fread(r, sizeof(int), 1, f);

rewind(f);

return;
}

void redim_imm(FILE *f, int r, int c)
{
rewind(f);
fseek(f, 18, SEEK_CUR);

fwrite(&c, sizeof(int), 1, f);
fwrite(&r, sizeof(int), 1, f);

return;
}

void dealloca(unsigned char ***m, int c)
{
int i,j;

for(i = 0; i < c; i++)
{
for(j = 0; j < 3; j++);
free(m[i][j]);
free(m[i]);
}

free(m);

return;
}

void scrivi_file(FILE *f, FILE *s, unsigned char ***m, int r, int c)
{
int i, j,k;

copia_header(s,f);

redim_imm(f,r,c);

rewind(f);
fseek(f,1078,SEEK_CUR);

for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
for(k = 0; k < 3; k++)
fwrite(&m[i][j][k], sizeof(char), 1, f);

dealloca(m,r);

return;
}


Ecco come risultano le immagini:
Originale
http://i50.tinypic.com/rlhoah.jpg
Ingrandita 2x
http://img807.imageshack.us/img807/8630/ingranditaimmagine.png


Scusate il disturbo e grazie per un eventuale chiarimento! :)

Gimli[2BV!2B]
19-05-2012, 16:32
Vedo che nell'header del file BMP aggiorni larghezza ed altezza in pixel dell'immagine, ma non vedo aggiornamenti alle informazioni su dimensione del file e dimensione dell'immagine contenuta.

Link di contesto con comodo riassunto dei dati dell'header. (http://paulbourke.net/dataformats/bmp/)

P.S. manca copia_header, ma immagino faccia ciò che dichiara, cioè un semplice leggi -> scrivi di tutti i dati dell'header dal file originale a quello nuovo.

P.P.S. scanf("%d", &scala) con scala char non mi convince al 100%... tanto vale fregarsene dei tre byte risparmiati ed usare un int?

mx92
19-05-2012, 18:38
;37481968']Vedo che nell'header del file BMP aggiorni larghezza ed altezza in pixel dell'immagine, ma non vedo aggiornamenti alle informazioni su dimensione del file e dimensione dell'immagine contenuta.

Link di contesto con comodo riassunto dei dati dell'header. (http://paulbourke.net/dataformats/bmp/)

P.S. manca copia_header, ma immagino faccia ciò che dichiara, cioè un semplice leggi -> scrivi di tutti i dati dell'header dal file originale a quello nuovo.

P.P.S. scanf("%d", &scala) con scala char non mi convince al 100%... tanto vale fregarsene dei tre byte risparmiati ed usare un int?


Intanto grazie mille per la risposta.
Ti posso dire che il programma applicato ad immagini ad 8bit (con le dovute modifiche) funziona alla perfezione quindi non credo sia li il problema

Per quanto riguarda la scanf lo so ho scritto una schifezza ma io sono abituato a scrivere i sorgenti prima in maniera molto grossolana e una volta che funzionano ottimizzo. Quindi avrei modificato al più presto.