Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3035 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1958445
kanatsu
Posté le 17-01-2010 à 18:12:00  profilanswer
 

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

mood
Publicité
Posté le 17-01-2010 à 18:12:00  profilanswer
 

n°1958449
Ummon
Posté le 17-01-2010 à 18:46:32  profilanswer
 

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

n°1958468
kanatsu
Posté le 17-01-2010 à 22:08:39  profilanswer
 

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

n°1958473
kanatsu
Posté le 18-01-2010 à 00:31:49  profilanswer
 

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

n°1958600
__tomjost
c'est un pseudo !
Posté le 18-01-2010 à 20:23:25  profilanswer
 

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  :)

n°1958610
tpierron
Posté le 18-01-2010 à 21:20:11  profilanswer
 

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


n°1958616
__tomjost
c'est un pseudo !
Posté le 18-01-2010 à 22:07:12  profilanswer
 

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:  
 

n°1958627
billgatesa​nonym
Posté le 18-01-2010 à 23:22:49  profilanswer
 

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

n°1958632
__tomjost
c'est un pseudo !
Posté le 19-01-2010 à 00:27:35  profilanswer
 

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
n°1958689
__tomjost
c'est un pseudo !
Posté le 19-01-2010 à 11:03:35  profilanswer
 


// 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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Création d'un fichier config a l'aide de tableauxListener sur une création d'objet
récupérer un lien de la bbd et le mettre sur un titre récupéréCréation de graphique Via Access
PHP : Création d'étoiles réalistes avec GD[résolu] création réseau ad-hoc
Besion personnel/ jeu video en cour de créationExcel: création mail automatique
Creation base de donnée gestion du stockpb selection.numberformat et format date
Plus de sujets relatifs à : création d'une figure géométrique au format bmp


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR