Problème en tête bitmap [Résolu]

Signaler
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008
-
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008
-
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

Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008

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.
Messages postés
14858
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
18 novembre 2020
93
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
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1
 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
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1
 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
Messages postés
18
Date d'inscription
samedi 14 juin 2008
Statut
Membre
Dernière intervention
11 novembre 2008

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?