C'est le code de mon projet en c, pour faire une symetrie horizontale d'un fichier bmp vers un autre fichier bmp, pour faire du vertical ou autre chose il n'y a qu' changer le contenu de la derniere boucle du programme, il y a aussi une gestion d'erreur
Source / Exemple :
//Programme de symetrie Horizontal pour image bmp 24bits taille illimitée
//Declaration des librairies
#include <stdio.h>
#include <conio.h>
#include <string.h>
//Prototypes
int sym_horiz (char* entree, char* sortie);
int test_file (char* entree, char* sortie);
//Fichier a lire = entree fichier a ecrire apres modification = sortie
//
void main(void)
{
char entree[255], sortie[255];// declaration variable fichier d'entree et de sortie
int erreur;//contient 0 si aucun pb, ou 1 si erreur(s)
printf("Nom du fichier a traiter : ");scanf("%s",&entree);
//demande d'entree du nom du fichier a traiter
insor:
printf("Nom du fichier de sortie : ");scanf("%s",&sortie);
//demande du nom du fichier de sortie (apres modif)
erreur=sym_horiz(entree,sortie);// envoi des nom de fichiers a traiter a la fct
if (erreur==2)
{
goto insor;
}
if (erreur==3)
{
printf("Ce n'est pas un fichier BMP valide\n");
}
if (erreur!=0)
{
printf("\nErreur");//affiche s'il y a eu erreur ou non
}
if (erreur==0)
{
printf("Symetrie horizontale reussie");
}
getch();//attente de la frappe d'une touche
}
//-----------------------------------------------------------------------------
int sym_horiz(char* entree, char* sortie)
{
int erreur;//contient 0 si aucun pb, ou 1 si erreur(s)
int i,h;//boucles
int bour, lig;//nbre de bits de bourrage, variable de transfert de donnees
int fin;//adresse dernier bit
int l0,l1,l2,l3,larg; //largeur
int h0,h1,h2,h3,haut; // hauteur
int offset; // debut de l'image
FILE *ent;
FILE *sor;
erreur=test_file(entree ,sortie);
if (erreur!=0)
{
goto fin;
}
// mise a 0 des variables de lecture hauteur et largeur
l0=0;l1=0;l2=0;l3=0;
h0=0;h1=0;h2=0;h3=0;
//ouverture des fichiers entree en lecture et sortie en ecriture
ent=fopen(entree,"rb");
sor=fopen(sortie,"ab");
offset=0;
fseek(ent,10,0);//va a l'adresse qui donne le debut de l'image
fread(&offset,1,1,ent);//lit la valeur et la met dans offset
//lecture/ecriture de l'entete
rewind(ent);
for(i=0;i<offset;i++)
{
fread(&lig,1,1,ent);
fwrite(&lig,1,1,sor);
}
//extraction et calcul de la largeur de l'image
fseek(ent,18,0);// va a l'adresse de debut des donnes de largeur
fread(&l0,1,1,ent);//poids faible
fread(&l1,1,1,ent);
fread(&l2,1,1,ent);
fread(&l3,1,1,ent);//poids fort
larg=l0+l1*256+l2*65536+l3*16777216;//conversion en decimal et mise dans larg
//extraction et calcul de la hauteur de l'image
// pas de deplacement vu que c'est a la suite
fread(&h0,1,1,ent);//poids faible
fread(&h1,1,1,ent);
fread(&h2,1,1,ent);
fread(&h3,1,1,ent);//poids fort
haut=h0+h1*256+h2*65536+h3*16777216;//conversion en decimal et mise dans haut
//calcul du nbre de bits de bourrage
switch ((3* larg)%4)// une largeur doit etre divisible par 4 pour etre comprise
{
case 0:bour=0;break; //on compense par le nbre de bits manquant
case 1:bour=3;break;
case 2:bour=2;break;
case 3:bour=1;break;
}
lig=0;//mise a 0 de la variable de lecture, en cas d'erreur on ecrira 0
fseek(ent,0,2);//placement la la fin du fichier
fin=ftell(ent); //lecture de l'adresse de fin
//procedure de lecture ecriture des bits
//c'est ici qu'il faut changer!!!
for (h=1;h<=haut;h++)
{
fseek(ent,fin-(h*(3*larg+bour)),0);
for(i=0;i<3*larg+bour;i++)
{
fread(&lig,1,1,ent);
fwrite(&lig,1,1,sor);
}
}
fclose(ent);fclose(sor); //fermeture des fichiers
fin:
return erreur;
}
//-----------------------------------------------------------------------------
int test_file(char *entree, char *sortie)// gestion d'erreur de fichier
{
int rep;//reponse a la question 1=oui 0=non le reste repose la ?
int b,m;//bmp? b="B" m="M"
FILE *in, *out;
if ((in = fopen(entree, "rt")) //teste si le fichier d'entree existe
== NULL)
{
printf("\nFichier d'entree inexistant.\n");//si non le dit et quitte
return 1;
goto fin;
}
if ((in = fopen(sortie, "rt"))//teste si le fichier d'entree existe
!= NULL)
{
printf("\nFichier de sortie existant.");
question:
printf("\nReecrire ? (0 : non, 1 : oui, 2 : quitter) ");scanf("%d",&rep);
if (rep>2)
{
printf("Erreur %d n'est pas une reponse possible\n",rep);
goto question;
}
if (rep==1)
{
return 0;
goto fin;
}
if (rep==0)
{
return 2;
goto fin;
}
if (rep==2)
{
return 1;
goto fin;
}
}
fclose(out);
fclose(in);
b=0;m=0;
in=fopen(entree,"rb");
fread(&b,1,1,in);
fread(&m,1,1,in);
fclose(in);
if (b!=0x42 || m!=0x4D)
{
return 3;
goto fin;
}
return 0;
fin:
}
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.