?
Hi,
wenn du einfach Daten Komprimieren willst kannst du das PCX Line Pack verwenden:
... Code ...
//lädt komprimierte Daten nach dem PCX-Decodierverfahren map= adresse anz=menge fp=filestream
void pcx_readmap(unsigned long map,unsigned long anz,FILE *fp)
{
unsigned char c,press;
unsigned long j=0;
while(j < anz) //j noch kleiner als Datenmenge ?
{
c = fgetc(fp); //lade ein Datenbyte
press=1; //Länge der Datenmenge vorerst 1
if((c&192) > 128) //ist dieses Datenbyte ein Kompress-schlüssel?
{
press = (c & 63); //neue Länge der Daten = kompressschlüssel&63
c = fgetc(fp); //lade tatsächliches Datenbyte (nextbyte)
}
//schreibe das Datenbyte in den Speicher bis press abgelaufen ist
while(press--) *((unsigned char *) (j+++map))=c;
}
}
//öffnet eine PCX Datei namens fname und ließt die Colordaten nach *colmem
FILE *pcx_open(unsigned char *fname,unsigned char *colmem)
{
FILE *fp=0;
short j=(SCOL*3)*(SBPP>>3); //so viele Farbbytes werden gelesen
if((fp=fopen(fname,"rb"))) //open PCX
{
fseek(fp,-(SCOL*3)*(SBPP>>3),2); //zum ende der Datei minus Farbbyteanzahl
while(j--) *colmem++ = (unsigned char)(fgetc(fp)); //Farben einlesen
fseek(fp,128,0); //Re.Positionieren 128byes unter Dateibeginn
}
return(fp);
}
short pcx_close(FILE *fp)
{
return((short)fclose(fp));
}
//lädt eine beliebige Anzahl von PCX Bildern in den Speicher adr ,die Bilder müssen
//die Namen 0.pcx 1.pcx 2.pcx ...usw. heißen, sie müssen im aktiven Verz. zu finden sein
short pcx_loadanz(short anz,unsigned long mapadr,unsigned long coladr)
{
FILE *fp;
short i;
char ftxt[10]; //Dateinamenshalter
unsigned long offset=0; //offset des nächsten Bildes im Speicher
for(i=0; i<anz; i++) //lese BitMapDaten der menge Anzahl
{
sprintf(&ftxt[0],"%d",i); //erzeuge Dateinamen aus Nummer
strcat(&ftxt[0],".pcx"); //Dateiendung .PCX anketten
if( (fp = pcx_open(&ftxt[0],(char *)coladr)) ) //open PcxFile
{
pcx_readmap((unsigned long) mapadr+offset,POS(PCXW,PCXH),fp); //lese Kompressmap
pcx_close(fp);
}else return(0);
offset+=POS(PCXW,(PCXH-1)); //nächstes bild an diese adresse +mapadr
}
return(i);
}
Und wenn Du es richtig machen willst lohnt es sich ultimativ die ADLER PackLib selber zu kompilieren : https://github.com/madler/zlib
Gruß
Karsten