我写了这个函数,但是在读取压缩数据那个循环的时候程序在读出几个正常的颜色代码后会读到一些乱码,以至于不能正常的将完整的压缩数据读入内存~~!我不知道毛病出在哪,求教各位!谢谢了
void PCX_Load(char *filename,long size)
{
FILE *fp;
int num_bytes,index,i;
unsigned int count=0;
unsigned char data;
char far *temp_buffer;
pcx_picture_ptr image;
if((fp = fopen(filename,"rb")) == NULL)
{
printf("cannot open file");
getch();
exit(0);
}
temp_buffer = (char far*)image;
size=size+128+768;
if ((image->buffer = malloc(size)) == NULL)
{
printf("\n cannot allocate buffer");
exit(1);
}
for (index = 0;index < 128;index++){
temp_buffer[index] = fgetc(fp);
}
fseek(fp,128,SEEK_SET);
while (count <= size){
data = fgetc(fp);
if(data >= 192 && data <= 255)
{
num_bytes = data-192;
data = fgetc(fp);
for (i=0; i<num_bytes; i++)
image->buffer[count++] = data;
}
else
image->buffer[count++] = data;
}
/*set palette*/
fseek(fp, -768, SEEK_END);
for (index = 0; index < 256; index++ )
{
image -> palette[index].red = (getc(fp) >> 2);
image -> palette[index].green = (getc(fp) >> 2);
image -> palette[index].blue = (getc(fp) >> 2);
}
fclose(fp);
for (index = 0; index < 256; index++)
{
outp(0x3c6, 0xff);
outp(0x3c8, index);
outp(0x3c9, image -> palette[index].red);
outp(0x3c9, image -> palette[index].green);
outp(0x3c9, image -> palette[index].blue);
}
memcpy((char far *)0xa000,(char far*)image->buffer,size/2);
}
这个是为PCX文件定义的结构体
typedef struct pcx_picture_typ
{
pcx_header header;
RGB_color palette[256];
char far *buffer;
} pcx_picture, *pcx_picture_ptr;
void PCX_Load(char *filename,long size)
{
FILE *fp;
int num_bytes,index,i;
unsigned int count=0;
unsigned char data;
char far *temp_buffer;
pcx_picture_ptr image;
if((fp = fopen(filename,"rb")) == NULL)
{
printf("cannot open file");
getch();
exit(0);
}
temp_buffer = (char far*)image;
size=size+128+768;
if ((image->buffer = malloc(size)) == NULL)
{
printf("\n cannot allocate buffer");
exit(1);
}
for (index = 0;index < 128;index++){
temp_buffer[index] = fgetc(fp);
}
fseek(fp,128,SEEK_SET);
while (count <= size){
data = fgetc(fp);
if(data >= 192 && data <= 255)
{
num_bytes = data-192;
data = fgetc(fp);
for (i=0; i<num_bytes; i++)
image->buffer[count++] = data;
}
else
image->buffer[count++] = data;
}
/*set palette*/
fseek(fp, -768, SEEK_END);
for (index = 0; index < 256; index++ )
{
image -> palette[index].red = (getc(fp) >> 2);
image -> palette[index].green = (getc(fp) >> 2);
image -> palette[index].blue = (getc(fp) >> 2);
}
fclose(fp);
for (index = 0; index < 256; index++)
{
outp(0x3c6, 0xff);
outp(0x3c8, index);
outp(0x3c9, image -> palette[index].red);
outp(0x3c9, image -> palette[index].green);
outp(0x3c9, image -> palette[index].blue);
}
memcpy((char far *)0xa000,(char far*)image->buffer,size/2);
}
这个是为PCX文件定义的结构体
typedef struct pcx_picture_typ
{
pcx_header header;
RGB_color palette[256];
char far *buffer;
} pcx_picture, *pcx_picture_ptr;