création d'une figure géométrique au format bmp

création d'une figure géométrique au format bmp - C - Programmation

Marsh Posté le 17-01-2010 à 18:12:00    

Bonjour alors voila j'ai un exercice noté que je dois faire en langage C sous le logiciel Dev C++ je dois créer un fichier image BMP c'est a dire créer le format de l'image ensuite créer un image de fond et ensuite l'alumage d'un point pour qu'a la fin je puisse faire apparaitre un cercle de coordonné M1(X1;Y1) et de rayon R et un segment .Le problème c'est que je n'y comprend rien au langage C et qu'a partir de là je ne vois pas comment faire. Merci d'avance a tout ceux qui me répondrons.  
 
 
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ROUGE 0x00FF0000
#define BLEU 0x000000FF
#define VERT 0x0000FF00
#define JAUNE 0x00FFFF00
#define CYAN 0x0000FFFF
#define NOIR 0x00000000
#define BLANC 0x00FFFFFF
#define ROSE 0x00FF00FF</couleur>
 
 
typedef unsigned char byte;  
typedef unsigned short int word;  
typedef unsigned long int dword;
 
typedef struct{  
    byte signature[2];
    dword taillefichier;
    dword inconnu;
    dword offsetimage;
}headerbmp;  
 
typedef struct{
    dword x;
    dword y;
    word plan;
    word bpp;
    dword compression;
    dword tailleimage;
    dword res_vertical;
    dword res_horizontale;
    dword nb_couleurs;
    dword nb_couleurs_importantes;
}   headerV4
 
#include "bmp.h"
void creation_image(dword largeur,dword hauteur,dword couleur_fond)
 
int main()
{
 
FILE* f;  
 
f=fopen(image,"w" );  
if (f==NULL){  
printf("ouverture impossible de %s\n",nomFichier);  
}
 
if (F != NULL)
    {
 
    }
 
}
void creation_image(dword largeur,dword hauteur,dword couleur_fond)
//en tete du fichier
 
headerbmp.signature[0]='B'
headerbmp.signature[1]='M'
headerbmp.taillefichier=3*longeur*hauteur+0x36;
headerbmp.inconnu=0;
headerbmp.offsetimage=0x36;
 
//en tete de l'image
 
headerV4.x=240;
headerV4.y=260;
headerV4.plan=1;
headerV4.bpp=24;
headerV4.compression=0;
headerV4.tailleimage=x*y*3;
headerV4.res_horizontale=0;
headerV4.res_verticale=0;
headerV4.nb_couleurs=0;
headerV4.nb_couleurs_importantes=0;
 
//les octects de l'image
Incomplet

Reply

Marsh Posté le 17-01-2010 à 18:12:00   

Reply

Marsh Posté le 17-01-2010 à 18:46:32    

Si t'as un exercice que tu dois faire en C c'est certainement que tu es censé avoir une certaine base.

Reply

Marsh Posté le 17-01-2010 à 22:08:39    

bah oui les base c'est ce que je vous est dit les étape dans l'ordre pour y arriver ensuite c'est a nous de le faire avec le cour mais aucun cour explique comment faire sa -_-. Donc j'ai commencé avec cela mais ensuite je ne voit pas comment faire

Reply

Marsh Posté le 18-01-2010 à 00:31:49    

bon alors voila une question s'il vous plait voila mon programme corriger en partie mais je n'arrive pas trouver les autre erreur  
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define ROUGE 0x00FF0000  
#define VERT 0x0000FF00  
#define BLEU 0x000000FF  
#define JAUNE 0x00FFFF00  
#define VIOLET 0x00FF00FF
#define CYAN 0x0000FFFF  
#define NOIR 0x00000000  
#define BLANC 0x00FFFFFF
 
typedef unsigned char      byte;  
typedef unsigned short int word;  
typedef unsigned long int dword;  
 
typedef struct
{  
    byte signature[2];
    dword taillefichier;
    dword inconnu;
    dword offsetimage;
}t_headerbmp;  
 
typedef struct
{
    dword l;
    dword h;
    word nbplan;
    word bpp;
    dword compression;
    dword tailleimage;
    dword r_horizontale;
    dword r_verticale;
    dword nb_couleurs;
    dword nb_couleurs_imp;
}t_headerV4;
 
int main(int argc, char *argv[])
{
FILE* f;  
 
f=fopen(image,"w" );  
if (f==NULL)
{  
 printf("ouverture impossible de %s\n",nomFichier);  
}
if (f != NULL)
    {
 
    }  
  system("PAUSE" );  
  return 0;
}
 
//Création de l'entete de la page
void creer_image_fond(dword hauteur,dword largeur,dword couleur)
 
t_headerbmp signature[0]='B';
t_headerbmp signature[1]='M';
t_headerbmp taillefichier=3*l*h+54;
t_headerbmp inconnu=0;
t_headerbmp offsetimage=0x36;
 
//Création de l'entete de l'image  
t_headerV4 l=260;
t_headerV4 h=320;
t_headerV4 plan=1;
t_headerV4 bpp=24;
t_headerV4 compression=0;
t_headerV4 tailleimage=3*h*l;
t_headerV4 r_horizontale=0;
t_headerV4 r_verticale=0;
t_headerV4 nb_couleurs=0;
t_headerV4 nb_couleurs_imp=0;
 
 
Pouvez vous m'aider s'il vous plait . Et me dire ou m'expliquer comment faire pour le buffer des pixels qui est l'étape juste après de l'exo

Reply

Marsh Posté le 18-01-2010 à 20:23:25    

BYTE pixels[3*h*l]; // ou utilise malloc , new ...
 
for(i=0; i<l*h*3; ++i) // ou si tu a autre idee ...
{
 //saute par 3 : tu met 4 byte et tu ecrase le dernier (plus rapide).
 *((DWORD*)pixels+i) = un couleur;  // un DWORD
}
... ok , tu verify encore.
 
y arriver ensuite c'est a nous de le faire avec le cour mais aucun cour explique comment faire sa  ... c'est toujours ca!!
 
bye  :)

Reply

Marsh Posté le 18-01-2010 à 21:20:11    

__tomjost a écrit :

Code :
  1. BYTE pixels[3*h*l]; // ou utilise malloc , new ...
  2. for(i=0; i<l*h*3; ++i) // ou si tu a autre idee ...
  3. {
  4.     //saute par 3 : tu met 4 byte et tu ecrase le dernier (plus rapide).
  5.     *((DWORD*)pixels+i) = un couleur;  // un DWORD
  6. }



 
Ouais, euh, en fait il y a quelques petits détails à faire attention là ....

  • Les lignes des fichiers BMP sont paddés sur 32bits. Donc la taille à allouer est ((l*3+3)&~3)*h (les couleurs sont ordonnées BGR).
  • Le point (0, 0) du bitmap est par défaut en bas à gauche de l'image. Pour le mettre en haut à gauche, il faut spécifier une hauteur négative dans l'entête.
  • Écrire un DWORD sur une adresse non alignée sur 32bits, c'est l'assurance d'un bus error.


Reply

Marsh Posté le 18-01-2010 à 22:07:12    

tpierron a écrit :


 
Ouais, euh, en fait il y a quelques petits détails à faire attention là ....

  • Les lignes des fichiers BMP sont paddés sur 32bits. Donc la taille à allouer est ((l*3+3)&~3)*h (les couleurs sont ordonnées BGR).
  • Le point (0, 0) du bitmap est par défaut en bas à gauche de l'image. Pour le mettre en haut à gauche, il faut spécifier une hauteur négative dans l'entête.
  • Écrire un DWORD sur une adresse non alignée sur 32bits, c'est l'assurance d'un bus error.




vos remarque sont tres utile  ;)  (vraiment!)
 
ok , l'image est stoker a l'inverse ( l'hauteur negative , oui)
BGR et pas RGB oui
 
Paddé sur 32 bit non , (ok je sais sur certain format on laisse un byte)
mais j'ai verifier un bmp sur windows , c'etait 3,3
 
...  :pt1cable:  
 

Reply

Marsh Posté le 18-01-2010 à 23:22:49    

Je suis d'accord avec les remarques de tpierron, y compris sur le padding, qui est aussi indiqué dans l'article de Wikipedia en anglais http://en.wikipedia.org/wiki/BMP_file_format . Peut-être que le padding ne serait pas obligatoire avec certains visualiseurs, mais ce n'est pas une règle générale.
J'ajouterais que le nombre de bits spécifiés au 22ème octet du header, nommé bpp par kanatsu et nommé biBitCount dans la structure BITMAPINFOHEADER de Windows, contient maintenant très souvent la valeur 32 plutôt que 24, ce qui élimine le problème potentiel du padding, et ce qui permet d'avoir un octet pour la transparence (alpha channel) (et on peut aussi avoir 32 bits même si on n'utilise pas la transparence).

Reply

Marsh Posté le 19-01-2010 à 00:27:35    

billgatesanonym a écrit :


... Peut-être que le padding ne serait pas obligatoire avec certains visualiseurs, mais ce n'est pas une règle générale. ...


Oui je me perd beaucoup au changement des details

 

j'ai mal vu ,tpierron parle des scan-line
se sont alignee sur 32bit , c'est vrai!
j'ai verifier ca.

 

j'ai pas utiliser cette functionalité depuis
des mois...et tu sais. :ouch:

 

:lol:  ca changee vite d'un exercice , a un super-tech

 

[ja ajoute quelque chose]
- le padding va accelere le transfert des scan line
- il ya CreateBitmap() aussi , plus facile... voir les detail


Message édité par __tomjost le 19-01-2010 à 00:33:25
Reply

Marsh Posté le 19-01-2010 à 11:03:35    


// jai fait une faute fatal , de precedence  :sweat: , et je corrige
 
for(i=0; i<l*h*3; i+=3){
*(DWORD*)(pixels+i) = un couleur;  // il va se renverser en BGR sur X86
}
 
// je fait ca sur une ligne  
// il peut avoir d'autre methode plus 'safe'! , avec plus de ..., type java par exemple.
 
 
// et pour le padding a vous de terminer ou changer , suivant le format du BMP
... jai peu de temps.  :ange:

Reply

Sujets relatifs:

Leave a Replay

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