Symetrie horizontale

Contenu du snippet

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:
}

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.