Création image bitmap aléatoire ou comme vous voulez :)

Soyez le premier à donner votre avis sur cette source.

Vue 6 146 fois - Téléchargée 384 fois

Description

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


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

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
43
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
3 mai 2010

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<hauteur*largeur; i++)
{
c = mText->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);
}
Messages postés
57
Date d'inscription
samedi 14 décembre 2002
Statut
Membre
Dernière intervention
2 mai 2005

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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
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+
Messages postés
55
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
4 août 2008

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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
ca marche bien ;) (a part la taille des images!)
mais c'est vraiment aleatoire?
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.