Pb de header avec du bitmap 24 bits - C++ - Programmation
Marsh Posté le 01-08-2002 à 23:37:39
Rien à voir, désolé pour la fausse joie que tu risques d'avoir. Mais je me devais de féliciter qqn comme toi, pour avoir eu l'audace de prendre ce pseudo. J'suis cassé.
Marsh Posté le 02-08-2002 à 01:27:53
Copier/coller d'une précédente réponse:
Pour des raisons d'efficacité, le compilateur aligne l'adresse des variables sur des multiples de 4, 8 ou + que le compilateur sait mieux gérer.
Dans un aggrégat (struct/class), cela se traduit par l'ajout d'octets de remplissage (padding) après des membres non multiples de cet alignement.
Donc le sizeof d'une struct/class est toujours multiple de cet alignement, et les tableaux n'ont pas de problème d'alignement.
Pour y remédier, cette solution (non standard):
Code :
|
Léger inconvénient: ces variables non alignées sont moins rapides d'accès.
Marsh Posté le 02-08-2002 à 23:49:58
hum...
t'oublie une chose -->
Code :
|
ca te fait donc un offset de 62 auquel il faut rajouter la pallette RVB
Marsh Posté le 01-08-2002 à 22:36:22
J'ai fait le programme suivant : je veux sauver au format bmp 24 bits le contenu du tableau colors (592*446 pixels - couleurs RGB ) . Le programme ne marche pas: il cree un fichier bmp mais lataille n'est pas bonne, il fait 792516 bytes au lieu de 792150 bytes. Je peux pas le lire.
Si quelqu'un pouvait me dire ou est mon erreur- je pense que c'est au niveua du header que ca chie.
Merci
typedef struct {
char id[2];
long filesize;
int reserved[2];
long headersize;
long infoSize;
long width;
long depth;
short biPlanes;
short bits;
long biCompression;
long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
long biClrUsed;
long biClrImportant;
} BMPHEAD;
BMPHEAD bh;
memset ((char *)&bh,0,sizeof(BMPHEAD)); /* sets everything to 0 */
memcpy (bh.id,"BM",2);
bh.filesize = 592*446*3+54 ;
bh.headersize = 54L ;
bh.infoSize = 0x28L ;
bh.width = 592 ;
bh.depth = 446 ;
bh.biPlanes = 1 ;
bh.bits = 24 ;
FILE *bmpfile = fopen("name.bmp", "wb" );
int bytesPerLine = 1776; //3*592
fwrite(&bh, 1, sizeof (bh), bmpfile);
int *linebuf;
linebuf=(int *)calloc(10000,sizeof(*linebuf));
for (i=446;i>0;i--)
{ for (int k=0;k<592;k++)
{ linebuf[3*k]=GetBValue(colors[k][i]) ;
linebuf[3*k+1]=GetGValue(colors[k][i]) ;
linebuf[3*k+2]=GetRValue(colors[k][i]) ;
}
fwrite(linebuf, 1, bytesPerLine, bmpfile);
}
fclose(bmpfile);
EndPaint(hwnd1,&ps);
}