Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Immagini bmp con C

  1. #1

    Immagini bmp con C

    Ciao a tutti, ho la necessita di leggere 1 immagine monocromatica bmp da file ed ottenere la matrice associata all'immagine da memorizzare in un parametro. Questa è il mio codice:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    // immagine(i) sorgente

    #define SX 512
    #define SY 512

    unsigned char ImmagineS1[SX * SY];


    // header per file BitMap monocromatici

    #define DIM_HEAD_BMP 1078

    unsigned char Header[DIM_HEAD_BMP];

    static void CaricaBmp(const char *Nome, unsigned char *Dove, int x, int y)
    {
    FILE *fHan = fopen(Nome, "rb");
    if(fHan == NULL) {
    printf("errore!\n");
    exit(1);
    }
    fread(Header, DIM_HEAD_BMP, 1, fHan);
    fread(Dove, x * y, 1, fHan);
    fclose(fHan);
    }


    int main(void)
    {
    CaricaBmp("input.bmp", ImmagineS1, SX, SY);

    }

    Come faccio ad ottenere la matrice associata all'immagine?

    Ringrazio tutti in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Che cosa intendi per "matrice associata"? Usa i tag code quando posti il codice.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Hai ragione:

    codice:
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <math.h>  
    // immagine(i) sorgente  
    #define SX	512 
    #define SY	512  
    unsigned char ImmagineS1[SX * SY];  
    // immagine destinazione  
    #define DX	512 
    #define	DY	512  
    unsigned char ImmagineD[DX * DY];  
    // header per file BitMap monocromatici  
    #define DIM_HEAD_BMP 1078  
    unsigned char Header[DIM_HEAD_BMP];  
    
    static void CaricaBmp(const char *Nome, unsigned char *Dove, int x, int y) { 	
       FILE *fHan = fopen(Nome, "rb"); 	
       if(fHan == NULL) { 		
          printf("errore!\n"); 		
          exit(1); 	
       } 	 	
       fread(Header, DIM_HEAD_BMP, 1, fHan); 	
       fread(Dove, x * y, 1, fHan); 	
       fclose(fHan); 
    }  
    
    static void SalvaBmp(const char *Nome, unsigned char *DaDove, int x, int y) {
       FILE *fHan = fopen(Nome, "wb"); 	
       if(fHan == NULL) { 		
          printf("errore!\n"); 		
          exit(1); 	
       } 	 	
       fwrite(Header, DIM_HEAD_BMP, 1, fHan); 	
       fwrite(DaDove, x * y, 1, fHan); 	
       fclose(fHan); 
    }  
    
    int main(void) { 	
       CaricaBmp("input.bmp", ImmagineS1, SX, SY); 	 	
       SalvaBmp("output.bmp", ImmagineD, DX, DY);  	 	
       return 0;  }
    devo lavorare sull'immagine BMP e visto che 1 immagine non è altro che una matrice di pixel ho bisogno di quest'ultima. Come posso ottenerla?

    Grazie!

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Beh la bitmap E' quello che stai cercando: nel file bitmap sono memorizzati direttamente i pixel, senza alcuna conversione da fare. Quindi ti basta leggere il file dritto in una matrice di "pixel", la cui dimensione devi scegliere in base al formato della bitmap (il numero di bit utilizzato per ogni colore).
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #5
    Nel mio caso devo scomporre la matrice originale in sottomatrici. Quindi la bitmap relativa all'immine che carico la ottengo quando faccio fread()?

  6. #6
    La questione non è così semplice... le BMP (di fatto packed DIB) hanno prima dei dati effettivi una serie di header che specificano i vari attributi dell'immagine. La questione è ulteriormente complicata dal fatto che la matrice contiene i dati "impacchettati", nel senso che in un'immagine monocromatica in ciascun byte ci saranno 8 pixel (uno per bit); in più, le righe sono quasi sempre memorizzate in ordine inverso (il formato è stato definito nei primi anni '90, e bisognava esser compatibili con non ricordo che software strambo), e ciascuna riga è allineata a DWORD (ossia, ogni riga deve iniziare ad un byte multiplo di 4).
    Puoi trovare informazioni utili in proposito nella prima parte di questo articolo, e un po' di altro materiale di riferimento qui e qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.