Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème en tête bitmap [ Windows / Multimédia ] (piroman14)

lundi 23 juin 2008 à 15:58:10 | Problème en tête bitmap

piroman14

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; i<imax; i++, vtk++)
       fwrite(vtk,sizeof(unsigned char),1,fp3d);


 //Image 2D
 fp2d= scatOpenFile(name1,ext2d,mode);

 // on définit l'en tête du fichier bmp
 
 bmfh->bfType='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;i<imax;i++){
   for(j=0;j<jmax;j++){
     for(k= label1, pixMax= 0; k<label0; k++) {
       pix= *(vtkPtr+(k*(jmax*imax)+j*imax+i));
    if(pix>pixMax) 
   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;   
 

   }
    }
  }
}  
 


lundi 23 juin 2008 à 16:32:47 | Re : Problème en tête bitmap

buno

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

lundi 23 juin 2008 à 17:02:02 | Re : Problème en tête bitmap

glipper

Membre Club
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

lundi 23 juin 2008 à 17:13:12 | Re : Problème en tête bitmap

glipper

Membre Club

 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

mardi 24 juin 2008 à 10:09:21 | Re : Problème en tête bitmap

piroman14

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?


mardi 1 juillet 2008 à 10:48:58 | Re : Problème en tête bitmap

piroman14

Réponse acceptée !
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.



Cette discussion est classé dans : int, for, char, unsigned, bmih


Répondre à ce message

Sujets en rapport avec ce message

transformer un tableau 2d en image bitmap [ par gyzmo1 ] Bonjour a tous, voilà mon problème, je suis en train de mettre en place une méthode de comparaison de signature manuscrites. Cette méthode s applique Segmentation Fault....en traitement d'image [ par psysta ] Bonjour,je suis nouveau dans la programmation en C. J'ai un programme Matlab qui marche bien, et je souhaiterais l'implémenter en C. Le pgm compile bi comment afficher un pixel en VGA ? [ par LedPaL ] Slt,je programme ac dev-cpp et j'arrive pas a afficher de pixels a l'écran !!! de l'aide plz !!voici un bout de ma source:unsigned char * ecran = (uns Comment forcer le RTS pour une liaison RS232 [ par ancat ] Bonjourje viens de faire un petit prog (grandement inspire de sources du site) mais je ne saisis pas trop le controle du RTS.Celui ci est-il traite pa Pointeurs et Desallocation [ par gilimcce ] Bonjour à tous....je declare une fonctionloadJpegImage(char *, unsigned char*, int*, int*)1e parametre : le chemin de l'image chargee2e // algorithmique de fonction rec [ par fs_fck_sarko ] bonjour tout le monde, est ce que quelquun pourai maider pour le calul de complexite d'un programme qui resout les sudoku ? En fait je voudrais trouve acceder aux éléments d' un unsigned char ** [ par ththththth ] Bonjour à tous !!!J'ai un petit probleme pour acceder aux éléments d'un unsigned char**.Un pti bout de code sera plus simple...unsigned char **t = (un matrice de caractere en c [ par flofloo ] slt tout le monde voici mon probleme : char **Init_Matrice_IrcMSG(int ligne,int colone){     char **mat = NULL;     int i;     mat = c++ [ par gilles8111 ] salut,je suis débutant en c++,j'ai jusqu'ici toujours programmé en java. Mon problème est le suivant: j'ai implémenté une classe CSpieler dont le cons quadtree [ par pulsaqui ] Bonjour; je suis un débutant en programation C++ . Je cherche une implantation d'une class Quadtree class Quadtree { public: Quadtree()


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.