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

    [c++] errore struttura file .bmp

    Salve a tutti...
    avrei bisogno di una mano...

    sto studiando le strutture dei file bmp e cercando di fare qualche programmino.

    Su internet ho trovato questo tracciato:

    codice:
    /*
     * Windows BMP file definitions for OpenGL.
     *
     * Written by Michael Sweet.
     */
    
    #ifndef _BITMAP_H_
    #  define _BITMAP_H_
    
    /*
     * Include necessary headers.
     */
    
    #  include <GL/glut.h>
    #  ifdef WIN32
    #    include <windows.h>
    #    include <wingdi.h>
    #  endif /* WIN32 */
    
    /*
     * Make this header file work with C and C++ source code...
     */
    
    #  ifdef __cplusplus
    extern "C" {
    #  endif /* __cplusplus */
    
    
    /*
     * Bitmap file data structures (these are defined in <wingdi.h> under
     * Windows...)
     *
     * Note that most Windows compilers will pack the following structures, so
     * when reading them under MacOS or UNIX we need to read individual fields
     * to avoid differences in alignment...
     */
    
    #  ifndef WIN32
    typedef struct                       /**** BMP file header structure ****/
        {
        unsigned short bfType;           /* Magic number for file */
        unsigned int   bfSize;           /* Size of file */
        unsigned short bfReserved1;      /* Reserved */
        unsigned short bfReserved2;      /* ... */
        unsigned int   bfOffBits;        /* Offset to bitmap data */
        } BITMAPFILEHEADER;
    
    #  define BF_TYPE 0x4D42             /* "MB" */
    
    typedef struct                       /**** BMP file info structure ****/
        {
        unsigned int   biSize;           /* Size of info header */
        int            biWidth;          /* Width of image */
        int            biHeight;         /* Height of image */
        unsigned short biPlanes;         /* Number of color planes */
        unsigned short biBitCount;       /* Number of bits per pixel */
        unsigned int   biCompression;    /* Type of compression to use */
        unsigned int   biSizeImage;      /* Size of image data */
        int            biXPelsPerMeter;  /* X pixels per meter */
        int            biYPelsPerMeter;  /* Y pixels per meter */
        unsigned int   biClrUsed;        /* Number of colors used */
        unsigned int   biClrImportant;   /* Number of important colors */
        } BITMAPINFOHEADER;
    
    /*
     * Constants for the biCompression field...
     */
    
    #  define BI_RGB       0             /* No compression - straight BGR data */
    #  define BI_RLE8      1             /* 8-bit run-length compression */
    #  define BI_RLE4      2             /* 4-bit run-length compression */
    #  define BI_BITFIELDS 3             /* RGB bitmap with RGB masks */
    
    typedef struct                       /**** Colormap entry structure ****/
        {
        unsigned char  rgbBlue;          /* Blue value */
        unsigned char  rgbGreen;         /* Green value */
        unsigned char  rgbRed;           /* Red value */
        unsigned char  rgbReserved;      /* Reserved */
        } RGBQUAD;
    
    typedef struct                       /**** Bitmap information structure ****/
        {
        BITMAPINFOHEADER bmiHeader;      /* Image header */
        RGBQUAD          bmiColors[256]; /* Image colormap */
        } BITMAPINFO;
    #  endif /* !WIN32 */
    
    /*
     * Prototypes...
     */
    
    extern GLubyte *LoadDIBitmap(const char *filename, BITMAPINFO **info);
    extern int     SaveDIBitmap(const char *filename, BITMAPINFO *info,
                                GLubyte *bits);
    
    #  ifdef __cplusplus
    }
    #  endif /* __cplusplus */
    #endif /* !_BITMAP_H_ */
    l'errore sta nel fatto che nella prima struttura BITMAPFILEHEADER, che dovrebbe essere di 14, la sizeof nella fwrite per cercare di modificare il file da 16 e non 14, e il problema è che se ci metto 14 non funziona nemmeno!!!
    sapete dirmi il perche!?!?

    grazie in anticipo...
    ciao!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Di quale fwrite parli? Quale compilatore usi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    grazie per la risposta!
    io utilizzo visual studio 2003...

    quello che ho messo è solo il file header contenente la struttura.
    la fwrite la faccio su un file bmp esistente per modificarne l'estenzione attraverso questa struttura...

    e appunto: le 2 strutture se contate sono di 14 byte e 40 byte, in totale 54 e si trova con gli standard dei bmp.

    ma se cerco di fare una fwrite x riscrivere i 2 record in questo modo:
    codice:
    BITMAPFILEHEADER header;
    BITMAPINFOHEADER info_header;
    .
    .
    .
    
    fwrite(header, sizeof(BITMAPFILEHEADER), 1, fp);
    fwrite(info_header, sizeof(BITMAPINFOHEADER), 1, fp);
    mi da un errore di run-time sulla prima fwrite.
    ho notato che la prima sizeof, invece di darmi 14, da 16... nn capisco proprio il perché... ma anche se metto 14 al posto della sizeof nella fwrite mi da lo stesso errore...

    altra cosa strana: se faccio una fwrite per ogni campo, utilizzando sizeof, FUNIZONA!
    non mi era mai capitata una cosa del genere...

    spero di essermi espresso con chiarezza!
    grazie! ciaooo

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Questo succede perche' l'allineamento in memoria di default delle strutture e' 32 bit (quindi 4 byte).

    Devi modificare questa impostazione e portarla a 2 o a 1 ...

    Inserisci all'inizio del codice una linea

    codice:
    #pragma pack(2)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Ecco a che serve pragma pack...
    e push? pop?? cosa fanno??
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Grazieeee!!! hai risolto tutti i miei problemi e ho imparato anche molte cose che non sapevo... ti ringrazia tutta la mia classe e anche il mio professore!!

    ciao!!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Dunadan91
    Grazieeee!!! hai risolto tutti i miei problemi e ho imparato anche molte cose che non sapevo... ti ringrazia tutta la mia classe e anche il mio professore!!

    ciao!!
    Di nulla ... Salutami tutti i tuo compagni e il tuo professore ... ... buono studio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Tra parentesi, visto che stai usando Visual Studio, per avere le strutture in questione già pronte ti basta includere <windows.h>.
    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.