PDA

Visualizza la versione completa : [c++] errore struttura file .bmp


Dunadan91
28-01-2009, 11:14
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:


/*
* 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! :D

oregon
28-01-2009, 11:19
Di quale fwrite parli? Quale compilatore usi?

Dunadan91
29-01-2009, 18:15
grazie per la risposta! :D
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:

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

oregon
29-01-2009, 18:20
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



#pragma pack(2)

XWolverineX
30-01-2009, 00:42
Ecco a che serve pragma pack...
e push? pop?? cosa fanno??

oregon
30-01-2009, 00:52
http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.71).aspx

Dunadan91
02-02-2009, 10:18
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!! :D

ciao!! :yuppi:

oregon
02-02-2009, 10:38
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!! :D

ciao!! :yuppi:

Di nulla ... Salutami tutti i tuo compagni e il tuo professore ... :ciauz: ... buono studio ...

MItaly
02-02-2009, 16:15
Tra parentesi, visto che stai usando Visual Studio, per avere le strutture in questione già pronte ti basta includere <windows.h>.

Loading