Etudes/BTS/C/Premiere annee/conversionRLE/biblio.c
2016-10-14 17:11:52 +02:00

150 lines
4.9 KiB
C

#include "biblio.h"
void testErreur(int retour, int valeurCorrecte, char messageErreur[])
{
if(retour != valeurCorrecte)
{
printf("Erreur lors de : %s.%d\n", messageErreur, errno);
exit(0);
}
}
void decompressBMP(char fichierCompresse[], char fichierGenere[])
{
int i;
enTeteFichierBMP enTeteFichier;
enTeteImageBMP enTeteImage;
rle couple;
couleur palette[NBCOULEURS];
FILE *imageCompress = fopen(fichierCompresse, "r");
FILE *imageGenere = fopen(fichierGenere, "w+");
if(imageCompress == NULL){
printf("Impossible car le premier fichier est invalide.\n");
exit(0);
}
if(imageGenere == NULL){
printf("Impossible car le second fichier est invalide.\n");
exit(0);
}
testErreur(fread(&enTeteFichier, sizeof(enTeteFichier), 1, imageCompress), 1, "copie enTeteFichier");
testErreur(fwrite(&enTeteFichier, sizeof(enTeteFichier), 1, imageGenere), 1, "ecriture enTeteFichier");
testErreur(fread(&enTeteImage, sizeof(enTeteImage), 1, imageCompress), 1, "copie enTeteImage");
enTeteImage.typeCompression = 0;
testErreur(fwrite(&enTeteImage, sizeof(enTeteImage), 1, imageGenere), 1, "ecriture enTeteImage");
testErreur(fread(palette, sizeof(couleur), NBCOULEURS, imageCompress), NBCOULEURS, "copie palette");
testErreur(fwrite(palette, sizeof(couleur), NBCOULEURS, imageGenere), NBCOULEURS, "ecriture palette");
while(fread(&couple, sizeof(rle), 1, imageCompress) == 1)
{
for(i = 0; i < couple.repetition; i++)
{
testErreur(fwrite(&couple.valCouleur, sizeof(char), 1, imageGenere), 1, "ecriture valCouleur");
}
}
fclose(imageCompress);
fclose(imageGenere);
}
void compresBMP(char fichierDecompresse[], char fichierGenere[])
{
char valOctet;
char octetSuivant;
unsigned int ligne;
short int compteur;
char finLigne = 0;
enTeteFichierBMP enTeteFichier;
enTeteImageBMP enTeteImage;
couleur palette[NBCOULEURS];
FILE *imageDecompress = fopen(("%s%s", fichierDecompresse, ".bmp"), "r");
FILE *imageGenere = fopen(fichierGenere, "w+");
if(imageDecompress == NULL){
printf("Impossible car le premier fichier est invalide.\n");
exit(0);
}
if(imageGenere == NULL){
printf("Impossible car le second fichier est invalide.\n");
exit(0);
}
testErreur(fread(&enTeteFichier, sizeof(enTeteFichier), 1, imageDecompress), 1, "copie enTeteFichier");
testErreur(fwrite(&enTeteFichier, sizeof(enTeteFichier), 1, imageGenere), 1, "ecriture enTeteFichier");
testErreur(fread(&enTeteImage, sizeof(enTeteImage), 1, imageDecompress), 1, "copie enTeteImage");
enTeteImage.typeCompression = 1;
testErreur(fwrite(&enTeteImage, sizeof(enTeteImage), 1, imageGenere), 1, "ecriture enTeteImage");
testErreur(fread(palette, sizeof(couleur), NBCOULEURS, imageDecompress), NBCOULEURS, "copie palette");
testErreur(fwrite(palette, sizeof(couleur), NBCOULEURS, imageGenere), NBCOULEURS, "ecriture palette");
testErreur(fread(&valOctet, sizeof(char), 1, imageDecompress), 1, "premier valOctet");
compteur = 0;
ligne = 0;
while(fread(&octetSuivant, sizeof(char), 1, imageDecompress) == 1)
{
if(valOctet == octetSuivant && compteur < 255 && ligne < enTeteImage.largeur)
{
compteur++;
ligne++;
}
else
{
testErreur(fwrite(&compteur, sizeof(char), 1, imageGenere), 1, "ecriture compteur");
testErreur(fwrite(&valOctet, sizeof(char), 1, imageGenere), 1, "ecriture valOctet");
compteur = 0;
valOctet = octetSuivant;
if(ligne >= enTeteImage.largeur)
{
testErreur(fwrite(&finLigne, sizeof(char), 1, imageGenere), 1, "ecriture retourLigne");
testErreur(fwrite(&finLigne, sizeof(char), 1, imageGenere), 1, "ecriture retourLigne");
ligne = 0;
}
}
}
testErreur(fwrite("0", sizeof(char), 1, imageGenere), 1, "ecriture finFichier");
testErreur(fwrite("1", sizeof(char), 1, imageGenere), 1, "ecriture finFichier");
fclose(imageDecompress);
fclose(imageGenere);
}
void compressBMP(char fichierDecompresse[], char fichierGenere[])
{
char octet;
char ch;
char* nomfichier = "RLE.bmp";
strcat(fichierDecompresse, nomfichier);
FILE *imageDecompress = fopen(fichierDecompresse, "r");
FILE *imageGenere = fopen(fichierGenere, "w+");
if(imageDecompress == NULL){
printf("Impossible car le premier fichier est invalide. %s\n", fichierDecompresse);
exit(0);
}
if(imageGenere == NULL){
printf("Impossible car le second fichier est invalide.\n");
exit(0);
}
while(fread(&octet, sizeof(char), 1, imageDecompress) == 1)
{
testErreur(fwrite(&octet, sizeof(char), 1, imageGenere), 1, "ecriture compteur");
}
fclose(imageDecompress);
fclose(imageGenere);
}