Compression rle (vc++ 5.0)

Description

c'est une compression tout ce qu'il y'as de plus facile !
le meme principe que la compression des pcx (format 8 bits) !
c'est excellent pour compressé certain fichier (ceux qui ont plein de byte pareil qui se suivent) et very bad pour d'autre !
la premiere partie (celle qui me sert a gerer ma fenetre windows) est pas du tout ansi mais il me semble que le reste l'est, mais je suis pas

Source / Exemple :


#include <windows.h>
#include <stdio.h>
#include "resource.h"

HWND		hMain;
HICON		hIcon;
HINSTANCE	hInstance;

BOOL CALLBACK MainDlg(HWND,UINT,WPARAM,LPARAM);

int NbrCarCons(const unsigned char *Src,const int &Taille);
int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
// ET = Estime Taille
int RLE_Decompacte_ET(unsigned const char *Src,const int &TailleSrc);
int RLE_Compacte_ET(unsigned const char *Src,const int &TailleSrc);

bool CompacterFichier(const char *FichierDest,const char *FichierSrc,int methode);
bool DecompacterFichier(const char *FichierDest,const char *FichierSrc,int methode);

int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil){
	hInstance = hThisInstance;
	hIcon = LoadIcon(hThisInstance,MAKEINTRESOURCE(IDI_ICON));
	DialogBox(hThisInstance,MAKEINTRESOURCE(IDD_MAINDIALOG),NULL,(DLGPROC) MainDlg);
	DestroyIcon(hIcon);
	return true;
};

BOOL CALLBACK MainDlg(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
	char	Buf[512],Buf2[512];
	
	switch(message){
		case WM_COMMAND:
			switch (LOWORD(wParam)){
				case IDC_COMP:
					GetDlgItemText(hwnd,IDC_FICHIER,Buf,512);
					GetDlgItemText(hwnd,IDC_FICHIER2,Buf2,512);
					CompacterFichier(Buf2,Buf,0);
				break;
				case IDC_DECOMP:
					GetDlgItemText(hwnd,IDC_FICHIER,Buf,512);
					GetDlgItemText(hwnd,IDC_FICHIER2,Buf2,512);
					DecompacterFichier(Buf2,Buf,0);
				break;
				case IDC_FERMER:
					SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,NULL);
				break;
			}
		break;

		case WM_INITDIALOG:
			hMain = hwnd;
			SendMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM) hIcon);
        break;

		case WM_CLOSE:
			EndDialog(hwnd, TRUE);
			return true;
		break;
    }
    return false;
}

int NbrCarCons(const unsigned char *Src,const int &Taille){
	int c,i;
	if(Taille == 0) return 0;
	c = *Src++;

	for(i=1;i<Taille;i++)
		if(c!=*Src++) break;
	
	return i;
}

int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest){
	int i,i2=0,Nbr,reste;
	unsigned char c;
	
	for(i=0;i<TailleSrc;i++){
		Nbr = NbrCarCons(Src,TailleSrc-i);
		c = *Src++;
		if(Nbr == 0) return 0;
		if(Nbr == 1){
			if(c>0xB0){
				i2 += 2;
				if(i2 > TailleDest) return 0;

  • Dest = 0xB1;
Dest++;
  • Dest = c;
Dest++; }else{ if((++i2)> TailleDest) return 0;
  • Dest = c;
Dest++; } }else{ if(Nbr>(0xFF-0xB0)){ reste = Nbr; while(reste>(0xFF-0xB0)){ i2 += 2; if(i2 > TailleDest) return 0;
  • Dest = 0xFF;
Dest++;
  • Dest = c;
Dest++; reste -= (0xFF-0xB0); } if(reste>0){ i2 += 2; if(i2 > TailleDest) return 0;
  • Dest = 0xB0+reste;
Dest++;
  • Dest = c;
Dest++; } }else{ i2 += 2; if(i2 > TailleDest) return 0;
  • Dest = 0xB0+Nbr;
Dest++;
  • Dest = c;
Dest++; } Src += Nbr-1; i += Nbr-1; } } return i2; } int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest){ int i,i2=0,i3; unsigned char c,c2=0; for(i=0;i<TailleSrc;i++){ c = *Src++; if(c2 == 0){ if(c>0xB0){c2 = c-0xB0;continue;} if((++i2)>TailleDest) return 0;
  • Dest = c;
Dest++; }else{ for(i3=0;i3<c2;i3++){ if((++i2)>TailleDest) return 0;
  • Dest = c;
Dest++; } c2 = 0; } } return i2; } int RLE_Decompacte_ET(unsigned const char *Src,const int &TailleSrc){ int i,i2=0; unsigned char c,c2=0; for(i=0;i<TailleSrc;i++){ c = *Src++; if(c2 == 0){ if(c>0xB0){c2 = c-0xB0;continue;} i2++; }else{ i2 += c2; c2 = 0; } } return i2; } int RLE_Compacte_ET(unsigned const char *Src,const int &TailleSrc){ int i,i2=0,Nbr,reste; unsigned char c; for(i=0;i<TailleSrc;i++){ Nbr = NbrCarCons(Src,TailleSrc-i); c = *Src++; if(Nbr == 0) return 0; if(Nbr == 1){ if(c>0xB0) i2+=2; else i2++; }else{ if(Nbr>(0xFF-0xB0)){ reste = Nbr; while(reste>(0xFF-0xB0)){ i2 += 2; reste -= (0xFF-0xB0); } if(reste>0) i2 += 2; }else{ i2 += 2; } Src += Nbr-1; i += Nbr-1; } } return i2; } bool CompacterFichier(const char *FichierDest,const char *FichierSrc,int methode){ FILE *Fichier; unsigned char *ContenuSrc,*ContenuDest; int TailleSrc,TailleDest; if((Fichier = fopen(FichierSrc,"rb")) == NULL) return false; fseek(Fichier,0,SEEK_END); TailleSrc = ftell(Fichier); fseek(Fichier,0,SEEK_SET); ContenuSrc = (unsigned char*) malloc(TailleSrc); fread(ContenuSrc,1,TailleSrc,Fichier); fclose(Fichier); TailleDest = RLE_Compacte_ET(ContenuSrc,TailleSrc); ContenuDest = (unsigned char*) malloc(TailleDest); TailleDest = RLE_Compacte(ContenuDest,ContenuSrc,TailleSrc,TailleDest); free(ContenuSrc); if((Fichier = fopen(FichierDest,"w")) == NULL){ free(ContenuDest); return false; } fwrite(ContenuDest,1,TailleDest,Fichier); fclose(Fichier); free(ContenuDest); return true; } bool DecompacterFichier(const char *FichierDest,const char *FichierSrc,int methode){ FILE *Fichier; unsigned char *ContenuSrc,*ContenuDest; int TailleSrc,TailleDest; if((Fichier = fopen(FichierSrc,"rb")) == NULL) return false; fseek(Fichier,0,SEEK_END); TailleSrc = ftell(Fichier); fseek(Fichier,0,SEEK_SET); ContenuSrc = (unsigned char*) malloc(TailleSrc); fread(ContenuSrc,1,TailleSrc,Fichier); fclose(Fichier); TailleDest = RLE_Decompacte_ET(ContenuSrc,TailleSrc); ContenuDest = (unsigned char*) malloc(TailleDest); TailleDest = RLE_Decompacte(ContenuDest,ContenuSrc,TailleSrc,TailleDest); free(ContenuSrc); if((Fichier = fopen(FichierDest,"w")) == NULL){ free(ContenuDest); return false; } fwrite(ContenuDest,1,TailleDest,Fichier); fclose(Fichier); free(ContenuDest); return true; }

Conclusion :


voila c'est tout con en fait les 2 algos importantes sont dans les fonctions :
int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);

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.