begin process at 2012 05 27 15:11:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > CRÉATION IMAGE BITMAP ALÉATOIRE OU COMME VOUS VOULEZ :)

CRÉATION IMAGE BITMAP ALÉATOIRE OU COMME VOUS VOULEZ :)


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Niveau :Débutant Date de création :20/12/2003 Date de mise à jour :22/12/2003 01:04:43 Vu / téléchargé :5 113 / 325

Auteur : jb60

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce code permet de créer une image bitmap de la largeur et de la hauteur qu'on veut en mode 24 bits.Compilé avec Borland C++ 5.02.
Les données images sont remplies suivant BGR classique de façon mathématique. Toutes les couleurs sont représentées si la taille de l'image est suffisament grande. Quelques commentaires sur les headers (info fichier bitmap) pour réussir à créer soi même son fichier image (fait avec l'aide de plusieurs sites internet que je n'ai pas cité, sorry).
Mais je vous laisse plutôt regarder mon source, il me semble assez clair (ou peut être pas :)

Source

  • #include <iostream.h>
  • #include <stdlib.h>
  • #include <windows.h>
  • #include <stdio.h>
  • #include <time.h>
  • #include <math.h>
  • void initialisation_BMP(FILE *stream, unsigned int t, unsigned int hauteur, unsigned int largeur)
  • {
  • const char *format="BM"; //identification du format bitmap
  • fwrite(format,1,2,stream);
  • unsigned int taille=t+54; //taille du header (donc sans les donnees images)
  • fwrite(&taille,sizeof(int),1,stream);
  • unsigned int reserved=0; //vaut zéro, je ne sais pas pourquoi
  • fwrite(&reserved,sizeof(int),1,stream);
  • unsigned int offset=54; //début des données images par rapport au début du fichier (octets)
  • fwrite(&offset,sizeof(int),1,stream);
  • unsigned int taille_entete=40; //taille de cet en-tête
  • fwrite(&taille_entete,sizeof(int),1,stream);
  • fwrite(&largeur,sizeof(int),1,stream); //en pixels
  • fwrite(&hauteur,sizeof(int),1,stream); //en pixels
  • short plans=1; //mettre cette valeur à 1
  • fwrite(&plans,sizeof(short),1,stream);
  • short bits_per_pixels=24; //16 777 216 couleurs
  • fwrite(&bits_per_pixels,sizeof(short),1,stream);
  • unsigned int compression=0; //pas de compression RLE
  • fwrite(&compression,sizeof(int),1,stream);
  • unsigned int taille_image=t; //taille des données image (octets)
  • fwrite(&taille_image,sizeof(int),1,stream);
  • unsigned int resolution_horizontale=1024; //nbre de pixels par mètre, pour l'impression
  • fwrite(&resolution_horizontale,sizeof(int),1,stream);
  • unsigned int resolution_verticale=1024; //nbre de pixels par mètre, pour l'impression
  • fwrite(&resolution_verticale,sizeof(int),1,stream);
  • unsigned int colors_used=0; //toutes les couleurs (pas de palette de couleur car on est en 24 bits
  • fwrite(&colors_used,sizeof(int),1,stream);
  • unsigned int colors_important=0; //toutes les couleurs sont importantes
  • fwrite(&colors_important,sizeof(int),1,stream);
  • }
  • void ecriture_donnees(FILE *stream, unsigned int t)
  • {
  • unsigned char bleu=1, vert=1, rouge=1;
  • randomize();
  • for (unsigned int i=0;i<t;i+=3)
  • {
  • //ecriture d'un pixel (24 bits, ou 8*3)
  • if (rouge==255) {if (vert==255) {if (bleu<255) bleu++; else bleu=1;}}
  • fwrite(&bleu,1,1,stream);
  • if (rouge==255) {if (vert<255) vert++; else vert=1;}
  • fwrite(&vert,1,1,stream);
  • if (rouge<255) rouge++; else rouge=1;
  • fwrite(&rouge,1,1,stream);
  • //fin de l'ecriture du pixel, choisissez les valeurs que vous voulez
  • //pour ecrire le bleu vert rouge de chaque pixel, valeur max=255 (1 octet).
  • //on peut par exemple créer un dégradé de couleurs (fonction sinus sur
  • //le bleu par exemple), ou les écrire toutes (ce que j'ai
  • //essayé de faire mais ça n'a pas marché, car il faudrait une taille d'image
  • //extrêmement grande), etc...
  • }
  • }
  • void main(void)
  • {
  • unsigned int hauteur, largeur;
  • cout<<"Entrez la largeur d'image voulue (en pixels) : ";
  • cin>>largeur;
  • cout<<endl;
  • cout<<"Entrez la hauteur d'image voulue (en pixels) : ";
  • cin>>hauteur;
  • cout<<endl;
  • unsigned int taille=hauteur*largeur*3; //taille des données image sans les entêtes
  • FILE *file;
  • file=fopen("image.bmp","wb");
  • initialisation_BMP(file, taille, hauteur, largeur); //création des entêtes
  • ecriture_donnees(file, taille); //écriture des données image
  • fclose(file);
  • //system("pause");
  • }
#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <math.h>

void initialisation_BMP(FILE *stream, unsigned int t, unsigned int hauteur, unsigned int largeur)
{
const char *format="BM";    //identification du format bitmap
fwrite(format,1,2,stream);
unsigned int taille=t+54;   //taille du header (donc sans les donnees images)
fwrite(&taille,sizeof(int),1,stream);
unsigned int reserved=0;    //vaut zéro, je ne sais pas pourquoi
fwrite(&reserved,sizeof(int),1,stream);
unsigned int offset=54;    //début des données images par rapport au début du fichier (octets)
fwrite(&offset,sizeof(int),1,stream);

unsigned int taille_entete=40;  //taille de cet en-tête
fwrite(&taille_entete,sizeof(int),1,stream);
fwrite(&largeur,sizeof(int),1,stream);   //en pixels
fwrite(&hauteur,sizeof(int),1,stream);   //en pixels
short plans=1;        //mettre cette valeur à 1
fwrite(&plans,sizeof(short),1,stream);
short bits_per_pixels=24;     //16 777 216 couleurs
fwrite(&bits_per_pixels,sizeof(short),1,stream);
unsigned int compression=0;   //pas de compression RLE
fwrite(&compression,sizeof(int),1,stream);
unsigned int taille_image=t;  //taille des données image (octets)
fwrite(&taille_image,sizeof(int),1,stream);
unsigned int resolution_horizontale=1024; //nbre de pixels par mètre, pour l'impression
fwrite(&resolution_horizontale,sizeof(int),1,stream);
unsigned int resolution_verticale=1024; //nbre de pixels par mètre, pour l'impression
fwrite(&resolution_verticale,sizeof(int),1,stream);
unsigned int colors_used=0;   //toutes les couleurs (pas de palette de couleur car on est en 24 bits
fwrite(&colors_used,sizeof(int),1,stream);
unsigned int colors_important=0;  //toutes les couleurs sont importantes
fwrite(&colors_important,sizeof(int),1,stream);
}

void ecriture_donnees(FILE *stream, unsigned int t)
{

unsigned char bleu=1, vert=1, rouge=1;
randomize();
for (unsigned int i=0;i<t;i+=3)
		{
      //ecriture d'un pixel (24 bits, ou 8*3)
      if (rouge==255) {if (vert==255) {if (bleu<255) bleu++; else bleu=1;}}
      fwrite(&bleu,1,1,stream);
      if (rouge==255) {if (vert<255) vert++; else vert=1;}
      fwrite(&vert,1,1,stream);
      if (rouge<255) rouge++; else rouge=1;
      fwrite(&rouge,1,1,stream);
      //fin de l'ecriture du pixel, choisissez les valeurs que vous voulez
      //pour ecrire le bleu vert rouge de chaque pixel, valeur max=255 (1 octet).
      //on peut par exemple créer un dégradé de couleurs (fonction sinus sur
      //le bleu par exemple), ou les écrire toutes (ce que j'ai
      //essayé de faire mais ça n'a pas marché, car il faudrait une taille d'image
      //extrêmement grande), etc...
      }
}

void main(void)
{
unsigned int hauteur, largeur;
cout<<"Entrez la largeur d'image voulue (en pixels) : ";
cin>>largeur;
cout<<endl;
cout<<"Entrez la hauteur d'image voulue (en pixels) : ";
cin>>hauteur;
cout<<endl;
unsigned int taille=hauteur*largeur*3;  //taille des données image sans les entêtes

FILE *file;
file=fopen("image.bmp","wb");

initialisation_BMP(file, taille, hauteur, largeur); //création des entêtes
ecriture_donnees(file, taille);                     //écriture des données image

fclose(file);
//system("pause");
}

 Conclusion

Comme d'habitude, n'hésitez pas sur les commentaires, qu'ils soient bon ou mauvais (mais je préfère bien sûr qu'ils soient bons, lol)...

J'ai mis un exe et une capture d'ecran dans le zip.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip PGCD, PPCM, ET FACTORISATION DE PLUSIEURS NOMBRES
Source avec Zip INVENTION D'UN NOUVEAU TYPE DE CRYPTAGE... (SI IL EST NUL, M...
CONVERTIR UN NOMBRE DECIMAL EN N'IMPORTE QUELLE BASE (JUSQU'...
DEBUT DU JEU DU SERPENT
Source avec une capture BOUGER LE CURSEUR EN MODE TEXTE, PLUS DE PROBLEME GRACE A DJ...

 Sources de la même categorie

Source avec Zip Source avec une capture PLANNING D'EQUIPE par grephit
Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi

Commentaires et avis

Commentaire de djl le 20/12/2003 17:35:59

tu peut mettre un exe stp, j'ai pas dev c++

Commentaire de djl le 20/12/2003 18:42:53

juste une chose a propos du code, fais
taille=hauteur*largeur*3; au lieu de
taille=hauteur*largeur*24; pour eviter certaines ioncoherences

Commentaire de ClamC le 21/12/2003 12:05:12

ca donne koi pour microsoft visual C++ 6 ????

Commentaire de jb60 le 21/12/2003 20:43:59

En fait, j'ai compilé ça sous borland c++ 5.02 (désolé j'avais oublié de mettre le compilo dans la description de la source).
Je vais ajouter un exe dans le zip et mettre une capture d'écran...

ClamC, je ne sais pas ce que ça donne sous visual c++ 6, je ne l'ai pas... Mais je pense que ça doit tout aussi bien marcher, à moins qu'il ne faille changer les headers pour la conformité avec ton compilateur.

Voila.

Commentaire de jb60 le 21/12/2003 21:15:39

tu as raison djl, il faut bien mettre * 3 et non pas *24 pour le calcul de la taille, je me suis légèrement embrouillé la tête entre les bits et les octets...
Désolé pour cette erreur (mais qui n'était qu'un simple erreur d'inattention (c'est pas de ma faute, lol).
Je corrigerais la source quand j'aurais le temps.

Commentaire de djl le 22/12/2003 20:55:20

ca marche bien ;) (a part la taille des images!)
mais c'est vraiment aleatoire?

Commentaire de jb60 le 23/12/2003 01:00:07

Non djl, dans l'exemple que j'ai écrit, le choix de la couleur pour chaque pixel du dessin se fait par implémentations successives (d'abord du rouge, puis du vert et enfin du bleu). Je pense que tu as du le voir tout seul, car j'ai vu quelques unes de tes sources, et tu es vraiment fort, j'ai vu que tu faisais même de la programmation OpenGL (effet de l'eau qui ondule, trop cool). Mais tu peux très bien changer à ton gré l'algorithme d'écriture pour chaque pixel du dessin. On peut donc très bien imaginer mettre un niveau de vert, bleu et rouge pour chaque pixel de façon aléatoire, en faisant simplement un random(256) pour le bleu, le vert et le rouge (c'est pour ca que j'avais mis les headers time.h et stdio.h ou stdlib.h, je sais plus).
Mais l'image obtenue n'est pas agréable du tout, ça ne ressemble a rien (tu peux t'en douter puisque c'est aléatoire...). J'avais écrit le code de cette manière au début, mais je l'ai ensuite changé en écrivant chaque couleur avec une fonction sinus pour faire un dégradé sur les couleurs, puis je l'ai écris comme il est dans le zip. Mais les goûts et les couleurs....
Donc voilà, j'espère que mon explication t'a plut.

Sinon, en ce moment je me concentre un peu sur les sockets, j'aimerais faire un petit outil de communication entre deux PC distants, ça m'interesse, mais la je débute simplement, je ne comprends pas encore tout. Voilà, encore merci pour tout vos commentaires, et si quelqu'un peut m'aider (djl par  exemple :) lol)
sur les sockets avec des trucs intéressants, qu'il n'ésite pas...

Au fait, j'ai vu qu'il y a un classement sur cppfrance qui donne les personnes les plus actives sur le site, avec un système de points, mais moi, lorsque j'ajoute une source par exemple, je ne recois pas de points, alors que c'est ce qui donne le plus de points d'après les explications de Nix je crois. En ce moment je n'ai que 3 points, et je crois qu'ils sont dus à mes réponses sur deux ou trois sondages auxquels j'ai répondu. Donc si on pouvait m'expliquer un peu plus ce truc, vu que j'ai vu que les scores des plus actifs d'entre nous sont largement supérieurs à 500. Merci d'avance et bonne prog à tous.

JB

Commentaire de djl le 23/12/2003 11:27:53

pour les points je pense que les messages sur le forum comptent beaucoup.
pour les sockets tu pourra trouve des tuto ici
http://www.programmation.org/tutoriaux/tutoriaux_prog/tutoriaux.php?lang=reseau

et si jamais ta besoin d'aide laisse un message sur le forum(moi j'y connai rien au sockets)
a+

Commentaire de Hellaynnea le 28/12/2003 22:13:17

Pour les sockets j'ai récupéré une source d'objets sockets sur le net super pratique (licence GPL) je fais mes projets avec ca maintenant :)
Si ca t'intéresse jte l'enverrai.
++hellaynnea

Commentaire de fuliculi le 04/05/2004 22:03:13

Ton code est très pratique mais j'ai rencontré un léger bug qui peut apparaître. Un décalage dans les couleurs. Pour régler le problème, j'ai du recourir à la force brute. Je place le pointeur manuellement au bon endroit pour chaque pixel. Je sais, c'est plus long mais ça m'a permis de corriger le bug. Bug qui ne doit pas venir de ton programme mais de la gestion de la mémoire par visual. Il n'est donc pas utile d'appliquer la modif pour ceux qui n'ont pas rencontré le bug. Ca donne quelque chose comme ça :


Ccolor c; //classe maison
fpos_t off;
fpos_t pos;
fgetpos( stream,&off );
unsigned char val;


for(unsigned long i=0; i&lt;hauteur*largeur; i++)
{         
c = mText-&gt;getRGB(i);

pos = off + i*3;
fsetpos( stream,&pos );

val = (unsigned char)(c.b*255);
fwrite(&val,1,1,stream);

val = (unsigned char)(c.g*255);
fwrite(&val,1,1,stream);

val = (unsigned char)(c.r*255);
fwrite(&val,1,1,stream);
}

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales