Pb de header avec du bitmap 24 bits

Pb de header avec du bitmap 24 bits - C++ - Programmation

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);
}

Reply

Marsh Posté le 01-08-2002 à 22:36:22   

Reply

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é.

Reply

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 :
  1. #pragma pack( push,1 ) //pas d'alignement
  2. struct Machin{
  3. char UnChar ;
  4. short UnShort ;
  5. };
  6. #pragma pack( pop ) //restaure l'alignement

Léger inconvénient: ces variables non alignées sont moins rapides d'accès.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 02-08-2002 à 23:49:58    

hum...
t'oublie une chose -->

Code :
  1. /******************** BitMapFileHeader *********************************/
  2. unsigned char bftype[2];   /* Contient les 2 caractere B et M designant le format bitmap  $00  */
  3. int bfsize;  /* Taille totale du fichier   $02  */
  4. short int bfReserved1;
  5. short int bfReserved2;
  6. int bfoffbits;  /*  Offset des bits du bitmap ds le fichier   $0A  */
  7. /******************** BitMapInfoHeader ********************************/
  8. int bisize;  /* Taille de cette structure en octets    $0E  */
  9. int biwidth;  /* Largueur du bitmap en pixel    $12  */
  10. int biheight;  /* Hauteur du bitmap en pixel    $16  */
  11. short int biPlane;
  12. short int bibitcount;  /* Bits couleurs par pixel (1 en monochrome)   $1C  */
  13. int bicompression;  /* Schema de compactage (0 pour aucun)    $1E  */
  14. int bisizeimage;  /* Taille de l'image en octets    $22  */
  15. int bixpelspermeter;  /* Resolution horizontale en pixels par metre   $26  */
  16. int biypelspermeter;  /* Resolution verticale en pixels par metre   $2A  */
  17. int biclrused;   /* Nombre de couleurs utilisées dans l'image    $2E  */
  18. int biclrimportant;   /* Nombre de couleurs importantes    $32  */

 
 
ca te fait donc un offset de 62 auquel il faut rajouter la pallette RVB

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed