|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: May 2012
Messaggi: 4
|
[C]Ingrandimento Immagine Bitmap 24bit
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 Codice:
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; } Originale ![]() Ingrandita 2x http://img807.imageshack.us/img807/8...taimmagine.png Scusate il disturbo e grazie per un eventuale chiarimento! ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
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. 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?
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#3 | |
Junior Member
Iscritto dal: May 2012
Messaggi: 4
|
Quote:
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. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:10.