Problème en tête bitmap

Résolu
piroman14 Messages postés 18 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 11 novembre 2008 - 23 juin 2008 à 15:58
piroman14 Messages postés 18 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 11 novembre 2008 - 1 juil. 2008 à 10:48
Slt tt le monde!
Je rencontre un petit problème dans mon algorithme. En effet, je n'arrive pas à coder l'en-tête d'une image bitmap correctement. J'obtiens biens un .bmp mais que je n'arrive pas à visualiser.
Merci de m'indiquer ce qui cloche.
Enfin désolé je suis une grosse noob en C et je compte sur les geeks que vous êtes pour progresser.
thanks



void scatSegmentImage(HISTOGRM *hist, unsigned int imax, unsigned int jmax,
        unsigned int kmax, double *echo, char *vtk, FILE* tmpf,
        unsigned char* name){


  unsigned char pix;
  unsigned int i, j, k, l, z;
  unsigned int jmax2;
  unsigned int label0= 0;
  unsigned int label1= 0;
  char* vtkPtr;
  int number= 0;


  FILE* fp2d;
  FILE* fp3d;
  unsigned char ext2d[7], ext3d[7], mode[7];
  unsigned char pixMax= 0;
  char name1[255];
 
 
  BITMAPFILEHEADER* bmfh;
  BITMAPINFOHEADER* bmih;
  RGBQUAD* rgbq;
 
  bmfh=(BITMAPFILEHEADER*)calloc(1,sizeof(BITMAPFILEHEADER));
  bmih=(BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER));
  rgbq=(RGBQUAD*)calloc(1,sizeof(RGBQUAD));
 
 jmax2=jmax;                     // pour que chaque ligne ait un nombre entier d'octet
 
  while((jmax/8)!=floor(jmax/8))
 
 jmax2=jmax+1;


  vtkPtr= vtk;
  rewind(tmpf);
  strcpy(ext2d,"_2D.bmp");
  strcpy(ext3d,"_3D.vtk");
  strcpy(mode,"wb");
  strcat(name,"_"); 
 


  //Reecriture dans un fichier 3D               //cette partie n'est pas à prendre en compte
  for(l= 0; l<kmax;l++){
    if(hist[l].minx!= 0){  //c'est un min
      label0= hist[l].minx;
      if(label1 != label0){
 sprintf(name1,"%s%.3d",name,number++);
 fp3d= scatOpenFile(name1,ext3d,mode);
 for(k=label1;k<label0;k++)
   for(j=0;j<jmax;j++)
     for(i= 0; ibfType='00';
 bmfh->bfSize=imax*jmax2+58; 
 bmfh->bfReserved1=0;
 bmfh->bfReserved2=0;
 bmfh->bfOffBits=58; 


 fwrite(bmfh,sizeof(BITMAPFILEHEADER),1,fp2d);


 bmih->biSize=40;
 bmih->biWidth=jmax2;
 bmih->biHeight=imax;
 bmih->biPlanes=1;
 bmih->biBitCount=8;
 bmih->biCompression=0;
 bmih->biSizeImage=imax*jmax2;
 bmih->biXPelsPerMeter=0;
 bmih->biYPelsPerMeter=0;
 bmih->biClrUsed=0;
 bmih->biClrImportant=0;
 
 fwrite(bmih,sizeof(BITMAPINFOHEADER),1,fp2d);


 rgbq->rgbBlue=0;
 rgbq->rgbGreen=0;
 rgbq->rgbRed=0;
 rgbq->rgbReserved=0;
 
    fwrite(rgbq,sizeof(RGBQUAD),1,fp2d);


 for(i=0;ipixMax) 
   pixMax= pix;
     }//for
    //printf("%.30d\n",pixMax);
       fwrite(&pixMax,sizeof(int),1,fp2d);            // c'est ici qu'on rentre les valeurs des pixels
      
    for(z=jmax;z<jmax2;z++) {                           // zero padding pour completer les octets vides en bout de ligne
    pixMax=0;
    fwrite(&pixMax,sizeof(unsigned char),1,fp2d);
    break;
    }//for


  }//for


 }//for
 
 fclose(fp2d);
 fclose(fp3d);
 label1= label0;   
 


   }
    }
  }
}  
 

5 réponses

piroman14 Messages postés 18 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 11 novembre 2008
1 juil. 2008 à 10:48
En bitmap je n'ai pas reussi à créer une image 8 bits en tons de gris.
J'ai contourné le problème en codant chaque pixel sur 24 bits et en donnant la même valeur aux trois couleurs R V B lors du fwrite.
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
23 juin 2008 à 16:32
Salut,
Il faut mettre le type à "BM"bmfh->fType 0x4d42;   // 0x42 "B" 0x4d = "M"

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
23 juin 2008 à 17:02
 jmax2=jmax;                     // pour que chaque ligne ait un nombre entier d'octet

Je crois qu'il faut que chaque ligne comporte un nombre total d'octets qui soit multiple de 4.
Le reste doit être complété avec des zéros.
Enfin du moins moi c'est comme ça que je faisais...

Glipper
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
23 juin 2008 à 17:13
 fwrite(bmih,sizeof(BITMAPINFOHEADER),1,fp2d);

ah oui aussi il peut y avoir un problème avec le padding du compilateur peut etre aussi.
Il existe une commande pour eviter ça :

#pragma pack(push,1)
........
#pragma pack(pop)

Mais bon je suis pas sur que tu en ai besoin dans ton cas.
Si tu veux, tu peux utiliser un logiciel qui s'appelle CR-Hexact (ou un autre) qui permet d'afficher ton fichier en hexadecimal.
Tu pourras ainsi comparer ton en-tête avec celui d'un vrai fichier bitmap et voir ce qui pose problème.

Bon voilà, ça peut t'aider peut-être (ou non...)

Glipper
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
piroman14 Messages postés 18 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 11 novembre 2008
24 juin 2008 à 10:09
Merci tout d'abord à vos réponses. =)
Tu as raison Bruno mais j'ai tenté ça par désespoir. J'avais bien mis avant bmfh->bfType='BM'; : ce qui revient au même.
Sinon, le problème que je me pose mtnt est:
Quelles valeurs attribuer aux champs
bmih->biClrUsed=?;
bmih->biClrImportant=?;
et
rgbq->rgbBlue=?;
rgbq->rgbGreen=?;
rgbq->rgbRed=?;
rgbq->rgbReserved=?;
si l'on souhaite visualiser une image 8bits en tons de gris?
0
Rejoignez-nous