Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [c++]leggere bitmap 8bit greyscale e crearne una copia

    Salve a tutti, dovrei:
    1. acquisire i pixel di un file in una matrice
    2. effettuare delle operazioni su questi dati,
    3. creare una copia del file bitmap con la matrice di dati modificata.

    Siccome la bitmap è a scale di grigi ed 8bit ogni, da come ho capito dal formato bitmap, c'è un solo valore da salvare nei dati e non 3 come per le RGB, giusto ?

    Detto questo, per acquisire i pixel in una matrice di char faccio così, tralasciando le definizioni di header e quant'altro :
    codice:
        fseek(fd, hdr.offset - sizeof(hdr) - sizeof(infoHdr), SEEK_CUR);
    
        for(y = 0; y < infoHdr.height; y++){
            for(x = 0; x < infoHdr.width; x++){
                (*dst)[(y * infoHdr.width + x)] = fgetc(fd); 
            }
            
            for(x = 0; x < (4 - (3 * infoHdr.width) % 4) % 4; x++)
                fgetc(fd);
        }
    Anche se non ho capito bene il secondo for innestato che cosa fa, non l'ho fatto interamente io.

    Detto questo passo direttamente al punto 3, magari per il punto 2 apro un 3d apposito poichè è abbastanza complesso,
    quindi mettiamo che ho fatto delle modifiche sulla matrice,
    devo creare un nuovo file bitmap con la nuova matrice di dati, e faccio così:
    codice:
        a=fread(&hdr, sizeof(hdr), 1, origine);
        fwrite(&hdr, sizeof(hdr), 1, copy);
        a=fread(&infoHdr, sizeof(infoHdr), 1, origine);
        fwrite(&infoHdr, sizeof(infoHdr), 1, copy);
        fseek(copy, sizeof(hdr) + sizeof(infoHdr), SEEK_SET);
        fwrite(modded,256*256,1,copy);
    dove modded è la matrice di caratteri modificata.
    Ora ho fatto una prova senza apportare modifiche alla matrice ed il problema è che la prima striscia superiore del nuovo file immagine, non è come dovrebbe, ma un pò sfalsata.

    E' corretto quello che faccio e come lo faccio ??

    Inoltre per poter operare sulla matrice di dati dell'immagine, opero delle conversioni da unsigned char to unsigned int e viceversa con dei semplici cast, e poi mi viene a creare un pò un macello sull'immagine,
    anche in tal caso, a livello teorico se opero delle conversioni di questo tipo vado ad incidere sull'immagine ?

    grazie per l'aiuto, e mi scuso se qualcosa non vi è chiaro, magari ve lo rispiego meglio,
    il problema è un pò complesso da riassumere tutto insieme!

  2. #2

    Re: [c++]leggere bitmap 8bit greyscale e crearne una copia

    Originariamente inviato da sirmark
    codice:
        a=fread(&hdr, sizeof(hdr), 1, origine);
        fwrite(&hdr, sizeof(hdr), 1, copy);
        a=fread(&infoHdr, sizeof(infoHdr), 1, origine);
        fwrite(&infoHdr, sizeof(infoHdr), 1, copy);
        fseek(copy, sizeof(hdr) + sizeof(infoHdr), SEEK_SET);
        fwrite(modded,256*256,1,copy);
    suggerimenti sul perchè nemmeno la copia del file funziona bene ?

  3. #3

  4. #4
    ragazzi analizzando in esadecimale la copia della bmp ho trovato il problema.
    è la palette, in pratica non viene copiata per intero, ma solo in parte.
    Come risolvo ?
    E' definita nell'header, in questo modo:
    codice:
    typedef struct{
        unsigned char red;
        unsigned char green;
        unsigned char blue;
        unsigned char luminance;
    } palette_struct;
    
    /*********************** STRUTTURA BITMAP **********************/
    typedef struct{
        short type;            /* 2 bytes */
        int size;              /* 4 bytes */
        short reserved1;       /* 2 bytes */
        short reserved2;       /* 2 bytes */
        int offset;            /* 4 bytes */
    } BMPHeader;               /*14 bytes TOTALI */
    
    typedef struct{
        int size;              /* 4 bytes */
        int width;		   /* 4 bytes */
        int height;            /* 4 bytes */
        short planes;          /* 2 bytes */
        short bitsPerPixel;    /* 2 bytes */
        unsigned compression;  /* 4 bytes */
        unsigned imageSize;    /* 4 bytes */
        int xPelsPerMeter;     /* 4 bytes */
        int yPelsPerMeter;     /* 4 bytes */
        int clrUsed;           /* 4 bytes */
        int clrImportant;      /* 4 bytes */
        palette_struct palette;/* 4 bytes */
    } BMPInfoHeader;           /*44 bytes TOTALI */
    /*********************** STRUTTURA BITMAP **********************/

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.