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

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

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.