📄 ch7.prg
字号:
/* 进行彩色转换 */
for(n=0;n<4;n++)
/* 提取四字节数据的某一位组成一字节(低四位有 */
/* 效)的彩色值 */
{
tempch2=tempch2<<1;
tempch2=tempch2|((buf[n]&0x80)?1:0);
buf[n]=buf[n]<<1;
}
tempch2=bmpcolor[tempch2];
/* 进行彩色转换 */
result=(tempch1<<4)|tempch2;
/* 把两字节数据合并成一字节数据 */
fwrite(&result,sizeof(char),1,bmp);
/* 写入BMP文件 */
}}
for(j=0;j<(4-((width+1)/2)%4)%4;j++)
/* 根据BMP文件的要求, 在行结束处添加数据, */
/* 以使一行数据的字节数为4的倍数 */
fwrite(0,sizeof(char),1,bmp);
}
prcdisp(100);
farfree(hp.start); /* 释放远程堆 */
fclose(bmp);
fclose(pic);
}
void expand(farmem *hp,FILE *pic)
{
unsigned char bcount;
char buffer[128];
while (1)
{
fread(&bcount,1,1,pic);/* 读入字节计数 */
if (feof(pic)) break;
if (bcount>0x80) /* 字节计数是否大于80H */
{
bcount=bcount&0x7f; /* 计算实际字节长度 */
fread(&result,1,1,pic);
/* 读入数据内容 */
for(i=0;i<bcount;i++)/* 展开成实际长度 */
{
*hp->p=result;
hp->p++;
}}
else
{
fread(buffer,bcount,1,pic);
/* 读入数据内容 */
farwrite(hp,buffer,bcount);
}}
hp->p=hp->start;
}
void clptopic(char *dest,char *source)
{
/* WINDOWS中的CLP文件(在640*480*16方式下)直接把四个彩色平面的数据依次 */
/* 存入CLP文件, 前面再加上一个文件头。 */
FILE *tempfile[4];
char tempfilename[4][13];
farmem hp;
printf("%s => %s : ",source,dest);
if (openfile(dest,source,&pic,&clp)) return;
fseek(clp,6,SEEK_SET);
fread(&length,sizeof(long),1,clp);
/* 读入bmp源文件的长度 */
fseek(clp,0xa,SEEK_SET);
fread(&offset,sizeof(long),1,clp);
/* 读入位图数据在clp文件中的偏移量 */
fseek(clp,offset+2,SEEK_SET);
fread(&width,sizeof(int),1,clp);
/* 读入图象宽度 */
fread(&height,sizeof(int),1,clp);
/* 读入图象宽度 */
fread(&bytewidth,sizeof(int),1,clp);
/* 读入一行图象的字节数 */
if (width/bytewidth!=8) /* 检查图像彩色位数 */
{
fclose(pic);
fclose(clp);
remove(dest);
return;
}
if (allocate(&hp,length)) return;
/* 申请远程堆 */
prcdisp(-1);
prcdisp(0);
fseek(clp,6,SEEK_CUR);
load(hp,clp,length); /* 把位图信息读入内存 */
for(i=0;i<4;i++)
if ((tempfile[i]=fopen(tmpnam(tempfilename[i]),"wb"))==NULL)
{ /* 为PIC文件准备临时文件 */
printf("Can't create temperory file on disk!\n");
fclose(clp);
fclose(pic);
remove(dest);
exit(1);
}
for(m=0;m<bytewidth;m++)
{
prcdisp(60*m/bytewidth);
for(n=0;n<height;n++)
{
for(i=0;i<4;i++)
{
farseek(&hp,i*38400L+n*bytewidth+m);
farread(&hp,&buf[i],sizeof(char));
/* 读入第i个彩色平面的第n行的第m个字节数据 */
buffer[i]=~buf[i]; /* 把该字节个位取反 */
}
res[0]=buffer[3]&(buffer[2]^buf[0]) | buf[3]&(buf[2]^buf[0]);
res[1]=buffer[3]&buffer[2] | buffer[3]&(buf[1]^buf[0])
| buf[3]&buffer[1]&buffer[0];
res[2]=buffer[2]&buffer[0]&buffer[1] | buffer[3]&buffer[2]&buf[1]&buf[0] |
buf[3]&buffer[0] | buf[3]&buffer[1];
res[3]=buffer[3]&(buffer[1]^buf[0]) | buf[3]&buffer[2]&(buf[1]^buf[0])|
buffer[3]&buf[2];
/* 换算成PIC文件的彩色数据 */
for(i=0;i<4;i++)
fwrite(&res[i],sizeof(char),1,tempfile[i]);
/* 写入相应的临时文件 */
}}
farfree(hp.start); /* 释放远程堆 */
memcpy(&pichead[0x5],&width,sizeof(int));
/* 把图像宽度拷贝到pic文件头中 */
memcpy(&pichead[0x7],&height,sizeof(int));
/* 把图像高度拷贝到pic文件头中 */
fwrite(pichead,0x800,1,pic);
/* 向pic目标文件写入文件头 */
for(i=0,count=0x800;i<4;i++)
{
prcdisp(60+i*10); /* 显示百分数提示 */
fclose(tempfile[i]);
tempfile[i]=fopen(tempfilename[i],"rb");
/* 重新打开临时文件 */
count+=compres(pic,tempfile[i]);
/* 压缩临时文件 */
fclose(tempfile[i]);
remove(tempfilename[i]);
/* 擦除临时文件 */
}
fseek(pic,0x7c,SEEK_SET);
fwrite(&count,sizeof(long int),1,pic);
/* 填写pic文件长度 */
prcdisp(100);
fclose(clp);
fclose(pic);
return;
}
void gotoxy(int x,int y)
{
union REGS in;
in.h.ah=0x02;
in.h.dh=y;
in.h.dl=x;
in.h.bh=0;
int86(0x10,&in,&in);
return;
}
void inputname(char * prompt,char * fix,char *name)
{
printf(prompt);
scanf("%s",name);
if (strchr(name,'.')==NULL)
strcat(name,fix);
}
void prcdisp(int percent)
{
if (percent==100)
{
printf("\b\b100% Done!\n");
return;
}
if (percent==-1)
{
printf(" %\b");
return;
}
printf("\b\b%2d",percent);
}
int allocate(farmem *hp,long lsize)
{
if ((hp->p=hp->start=farmalloc(lsize))==NULL)
{
printf("File too big to load!\n");
return(1);
}
return(0);
}
int load(farmem buffer,FILE *source,long size)
{
char far *temp;
unsigned i=1;
if ((temp=malloc(4096))==NULL)
{
printf("Near heap full!\n");
return(1);
}
for(;i;)
{
i=fread((void *)temp,1,4096,source);
movedata(FP_SEG(temp),FP_OFF(temp),FP_SEG(buffer.p),
FP_OFF(buffer.p),i);
buffer.p+=i;
}
free(temp);
return(0);
}
void farread(farmem *buffrom,char far * bufto,unsigned size)
{
movedata(FP_SEG(buffrom->p),FP_OFF(buffrom->p),FP_SEG(bufto),
FP_OFF(bufto),size);
buffrom->p+=size;
return;
}
void farwrite(farmem *bufto,char *buffrom,unsigned size)
{
movedata(FP_SEG(buffrom),FP_OFF(buffrom),
FP_SEG(bufto->p),FP_OFF(bufto->p),size);
bufto->p+=size;
}
void farseek(farmem *hp,long location)
{
hp->p=hp->start+location;
}
int openfile(char *dest,char *source,FILE **fdest,FILE **fsource)
{
if ((*fsource=fopen(source,"rb"))==NULL)
{
/* 打开被转换的源文件 */
printf("%s can't open!\n",source);
return(1);
}
if ((*fdest=fopen(dest,"wb"))==NULL)
{
/* 打开转换后的目标文件 */
printf("%s can't create!\n",dest);
fclose(*fsource);
return(1);
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -