begin process at 2013 05 24 05:24:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > CONVERSION DE FICHIER EN FICHIER BMP

CONVERSION DE FICHIER EN FICHIER BMP


 Information sur la source

 Description

Dans la même optique que ma source précédente, voici un programme pour faire des fichiers bmp en utilisant un fichier quelconque. Il prend en argument le nom du fichier à convertir et le nom du fichier de sotie (facultatif).

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <string.h>
  • #include <math.h>
  • int main(int argc, char *argv[])
  • {
  • /* BMP header */
  • char BM[2] = "BM"; //Magic number
  • int FileSize; //Size of the BMP file
  • short Creator1 = 0; //Unused
  • short Creator2 = 0; //Unused
  • int DataStart = 54; //Offset where the pixel array (bitmap data) can be found
  • /*DIB header */
  • int DIB = 40; //Number of bytes in the DIB header (from this point)
  • int Width;
  • int Height;
  • short ColorPlanes = 1;
  • short BitsPerPixel = 24;
  • int Compression = 0; //BI_RGB, no pixel array compression used
  • int DataSize; //Size of the raw data in the pixel array (including padding)
  • int HorizontalResolution = 0;
  • int VerticalResolution = 0;
  • int ColorPalette = 0; //Number of colors in the palette
  • int ImportantColors = 0; //0 means all colors are important
  • /*Data start */
  • char RawName[FILENAME_MAX], BmpName[FILENAME_MAX] = "bmp.bmp";
  • if(argc > 1)
  • {
  • strcpy(RawName, argv[1]);
  • if(argc > 2)
  • strcpy(BmpName, argv[2]);
  • }
  • else
  • {
  • printf("bmp [RawFile]\n");
  • return -1;
  • }
  • FILE *raw = fopen(RawName, "rb+");
  • if(raw == NULL)
  • {
  • printf("File \"%s\" not found.\n", RawName);
  • return -1;
  • }
  • FILE *bmp = fopen(BmpName, "wb");
  • if(bmp == NULL)
  • {
  • printf("Can not create \"%s\".\n", BmpName);
  • return -1;
  • }
  • fseek(raw, 0, SEEK_END);
  • DataSize = ftell(raw); //donnees
  • int tmp = DataSize;
  • while(1)
  • {
  • if(tmp%3 == 0 && tmp%4 == 0 && (float)sqrt(tmp/3)-(int)sqrt(tmp/3) == 0 && (int)sqrt(tmp/3)%4 == 0) //Pour avoir un nombre de données multiple de 3 (RGB), aucun padding (multiple de 4), ainsi qu'un carre.
  • break;
  • else
  • tmp++;
  • }
  • printf("Bits de plus : %d\n", tmp-DataSize);
  • Width = sqrt(tmp/3);
  • Height = sqrt(tmp/3);
  • DataSize = tmp;
  • FileSize = 54 + DataSize;//header + donnees
  • printf("File Size = %d bits (%.0f kb)\n", FileSize, (float)FileSize/1024);
  • fwrite(BM, 1, 2, bmp);
  • fwrite(&FileSize, 4, 1, bmp);
  • fwrite(&Creator1, 2, 1, bmp);
  • fwrite(&Creator2, 2, 1, bmp);
  • fwrite(&DataStart, 4, 1, bmp);
  • fwrite(&DIB, 4, 1, bmp);
  • fwrite(&Width, 4, 1, bmp);
  • fwrite(&Height, 4, 1, bmp);
  • fwrite(&ColorPlanes, 2, 1, bmp);
  • fwrite(&BitsPerPixel, 2, 1, bmp);
  • fwrite(&Compression, 4, 1, bmp);
  • fwrite(&DataSize, 4, 1, bmp);
  • fwrite(&HorizontalResolution, 4, 1, bmp);
  • fwrite(&VerticalResolution, 4, 1, bmp);
  • fwrite(&ColorPalette, 4, 1, bmp);
  • fwrite(&ImportantColors, 4, 1, bmp);
  • printf("Creating %s...\n", BmpName);
  • char *p = calloc(DataSize,sizeof(char)); //calloc pour avoir des 0 (noir) pour les pixels supplementaires
  • if(p == NULL)
  • {
  • printf("Dynamic memory allocation failed.\n");
  • return -1;
  • }
  • fseek(raw, 0, SEEK_SET);
  • fread(p, 1, DataSize, raw);
  • fwrite(p, 1, DataSize, bmp);
  • printf("%s created.\n", BmpName);
  • free(p);
  • fclose(raw);
  • fclose(bmp);
  • }
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc, char *argv[])
{
	/* BMP header */
	char BM[2] = "BM"; //Magic number
	int FileSize; //Size of the BMP file
	short Creator1 = 0; //Unused
	short Creator2 = 0; //Unused
	int DataStart = 54; //Offset where the pixel array (bitmap data) can be found
	/*DIB header */
	int DIB = 40; //Number of bytes in the DIB header (from this point)
	int Width;
	int Height;
	short ColorPlanes = 1;
	short BitsPerPixel = 24;
	int Compression = 0; //BI_RGB, no pixel array compression used
	int DataSize; //Size of the raw data in the pixel array (including padding)
	int HorizontalResolution = 0;
	int VerticalResolution = 0;
	int ColorPalette = 0; //Number of colors in the palette
	int ImportantColors = 0; //0 means all colors are important
	/*Data start */
	
	char RawName[FILENAME_MAX], BmpName[FILENAME_MAX] = "bmp.bmp";
	if(argc > 1)
	{
		strcpy(RawName, argv[1]);
		if(argc > 2)
			strcpy(BmpName, argv[2]);
	}
	else
	{
		printf("bmp [RawFile]\n");
		return -1;
	}

	FILE *raw = fopen(RawName, "rb+");
	if(raw == NULL)
	{
		printf("File \"%s\" not found.\n", RawName);
		return -1;
	}
	FILE *bmp = fopen(BmpName, "wb");
	if(bmp == NULL)
	{
		printf("Can not create \"%s\".\n", BmpName);
		return -1;
	}
	fseek(raw, 0, SEEK_END);
	DataSize = ftell(raw); //donnees
	int tmp = DataSize;
	while(1)
	{
		if(tmp%3 == 0 && tmp%4 == 0 && (float)sqrt(tmp/3)-(int)sqrt(tmp/3) == 0 && (int)sqrt(tmp/3)%4 == 0) //Pour avoir un nombre de données multiple de 3 (RGB), aucun padding (multiple de 4), ainsi qu'un carre.
			break;
		else
			tmp++;
	}
	printf("Bits de plus : %d\n", tmp-DataSize);
	Width = sqrt(tmp/3);
	Height = sqrt(tmp/3);

	DataSize = tmp;
	FileSize = 54 + DataSize;//header + donnees
	printf("File Size = %d bits (%.0f kb)\n", FileSize, (float)FileSize/1024);
	
	fwrite(BM, 1, 2, bmp);
	fwrite(&FileSize, 4, 1, bmp);
	fwrite(&Creator1, 2, 1, bmp);
	fwrite(&Creator2, 2, 1, bmp);
	fwrite(&DataStart, 4, 1, bmp);
	fwrite(&DIB, 4, 1, bmp);
	fwrite(&Width, 4, 1, bmp);
	fwrite(&Height, 4, 1, bmp);
	fwrite(&ColorPlanes, 2, 1, bmp);
	fwrite(&BitsPerPixel, 2, 1, bmp);
	fwrite(&Compression, 4, 1, bmp);
	fwrite(&DataSize, 4, 1, bmp);
	fwrite(&HorizontalResolution, 4, 1, bmp);
	fwrite(&VerticalResolution, 4, 1, bmp);
	fwrite(&ColorPalette, 4, 1, bmp);
	fwrite(&ImportantColors, 4, 1, bmp);
	
	printf("Creating %s...\n", BmpName);
	char *p = calloc(DataSize,sizeof(char)); //calloc pour avoir des 0 (noir) pour les pixels supplementaires
	if(p == NULL)
	{
		printf("Dynamic memory allocation failed.\n");
		return -1;
	}
	fseek(raw, 0, SEEK_SET);
	fread(p, 1, DataSize, raw);
	fwrite(p, 1, DataSize, bmp);

	printf("%s created.\n", BmpName);
	free(p);
	
	fclose(raw);
	fclose(bmp);
}

 Conclusion

Les fichiers bmp sont étonnamment plus difficiles à gérer pour ce type d'opération qu'un wav, et donc ma source n'est pas des plus optimale, mais le tout fonctionne. Si jamais le fichier ne répond pas aux attentes fixées par le programme (aucun padding ainsi qu'une hauteur et largeur égale), il rajoute des octets jusqu'à ce que cette condition soie remplie. Les informations sur l'header du format bmp sont disponibles sur Wikipedia.


 Sources du même auteur

Source avec Zip ASSISTANT POUR TROUVER LES MINES AU DÉMINEUR SOUS WINDOWS XP
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE
GÉNÉRATION DE FICHIER .WAV

 Sources de la même categorie

PROBLEME DU LOGARITHME DISCRET par nkghislain
Source avec Zip ALGORITHMES DE SAC A DEAUX ,PIECE DE MONAIS ET MULTUPLICATIO... par brsmed
Source avec une capture PING SUR QT par LoVerMaKi
Source avec Zip SLITHER_LINK_JEUX par kossitykossity
Source avec Zip Source avec une capture DON'$COMUNIK_IRC par Donald2991

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CONVHTML : UN UTILITAIRE DE CONVERSION POUR FICHIERS HTML par pgl10
DATETIMECONVERTER par guill76
Source avec Zip [C] WD_STRING V2.2 par cyberripper
Source avec Zip [C] WD_STRING V1.9 par cyberripper
TECHNIQUE SIMPLE DE CONVERSION BINAIRE DÉCIMAL par DarthKhaos

Commentaires et avis

Commentaire de adrdu le 16/01/2012 18:38:25

bonsoir,

char BM[2] = "BM"; //Magic number   => il ne faut pas oublier '\0'

Le tableau doit être de taille 3. Le plus simple c'est de ne pas préciser la taille :
char BM[] = "BM";

Commentaire de seoseo le 17/01/2012 08:15:30

Mouais, ça serait plus propre. C'était pour indiquer explicitement le nombre d'octets que cette constante doit occuper dans le ficher.

Commentaire de pucepuce819 le 04/04/2012 21:03:53

moi sa ne marche pas pour koi??

Commentaire de seoseo le 07/04/2012 09:39:20

On dirait une question typique de commentcamarche.net. Ton "problème" ne vient certainement pas du code, mais d'un truc complètement hors contexte, donc tu peux expliquer clairement ce qui ne "marche" pas en m'envoyant des messages perso, ou en allant sur le magnifique passe-temps cité plus haut et poser ta question avec une hortheaugreaphe plus sympathique à lire (ajoute quelque métaphore et/ou hyperbole, mais surtout des virgules). Histoire de ne pas mettre trop de commentaires futiles sur cette page. (Comme celui-ci)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Conversion d un float [ par Seth ] Comment arrondir un float vers le nombre le plus proche.Exemple : (float)2.8 -&gt; 3 ! (float)2.3 -&gt; 2 Conversion de types de données... [ par nullspace ] J'ai jamais réussis à trouver une bonne solution pour convertir un type de variable dans une autre variable ayant un autre type.Par exemple...si j'ai Demande source en C conversion IEEE754 AU SECOUR!!!!!! [ par Benny54 ] Si vous avez quoi que ce soit sur la conversion IEEE754 en langage C envoyez le moi je suis au bord du GOUFFRE!!!!! source en c conversion Urgent [ par fleur ] je suis super débutante. Je cherche en C un code pour convertir un décimal en hexadécimal.Je vous remercie d'avance pour votre aide...j'en ai vraiment Conversion de type [ par Dlofret ] Bonjour, J'aimerais une façon simple d'afficher une donnée de type float dans un format string. Comment dois-jem m'y prendre ?? Conversion int -> char * [ par Xentor ] Bonjour tout le monde, et merci de lire mon message parce que je suis un vrai débutant !Je voudrais savoir comment convertir un entier en tableau de c Conversion de donnée [ par Johjo ] Salut tout le monde, je cherche à convertir une valeur char en valeur float et inversement de float en char. L'equivalent de Val et Str en basic.Merci pb de conversion de chaine de caractéres [ par Thanatos ] Bonjour,Je désirerais faire un programme sur les fonctions logiques de base : un utilisateur rentre une fonction logique et le programme lui sort la t Conversion Float to String [ par PierreP ] Bonjour à tous !je suis en train de me prendre la tête pour créer une fonction de conversion d'un réel en une chaine de caractère (problème du débutan Conversion de chaine en entier [ par JMGR ] Comment peut - on convertir une chaine qui contient par exemple "25" en entier ?Exemple :char texte[256]="25";int nombre;nombre = texte; //Erreur...<


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

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 : 1,061 sec (4)

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