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! :)
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! :)