📄 ch7.prg
字号:
gotoxy(1,10);
printf("Your Selection[1-5]: ");
while (1)
{
gotoxy(24,10);
i=getche();
if (i<0x36 && i>0x30)
break;
}
printf("\n");
switch (i)
{
case 0x31 : printf("\nbackcolor: ");
scanf("%d",&bkcolor);
/* 输入转换的背景色 */
if (bkcolor>15 ||bkcolor<0) bkcolor=15;
/* 若超出范围,则写入缺省值15 */
tempch1=(unsigned char)bkcolor;
printf("color: ");
scanf("%d",&ftcolor);
/* 输入转换的前景色 */
if (ftcolor>15 ||ftcolor<0) ftcolor=0;
/* 若超出范围,则写入缺省值0 */
tempch2=(unsigned char)ftcolor;
colorpad[0]=(tempch1<<4)|tempch1;
/* 根据前景与背景色,求得彩色填充值 */
colorpad[1]=(tempch1<<4)|tempch2;
colorpad[2]=(tempch2<<4)|tempch1;
colorpad[3]=(tempch2<<4)|tempch2;
inputname(prompt[0],fix[0],source);
/* 输入文件名 */
i=1; /* 确定目标文件后缀的索引值 */
convert=spttobmp;
/* 确定转换程序 */
break;
case 0x32 : inputname(prompt[1],fix[1],source);
/* 输入文件名 */
i=0; /* 确定目标文件后缀的索引值 */
convert=bmptospt;
/* 确定转换程序 */
break;
case 0x33 : inputname(prompt[1],fix[1],source);
/* 输入文件名 */
i=2; /* 确定目标文件后缀的索引值 */
convert=bmptopic;
/* 确定转换程序 */
break;
case 0x34 : inputname(prompt[2],fix[2],source);
convert=pictobmp;
i=1;
break;
case 0x35 : inputname(prompt[3],fix[3],source);
convert=clptopic;
i=2;
}
if (findfirst(source,&list,0))
/* 查找匹配的第一个目录项 */
{
printf("file not found!");
exit(1);
}
strcpy(dest,list.ff_name);
/* 转换成目标文件的文件名 */
strcpy(strchr(dest,'.'),fix[i]);
(* convert)(dest,list.ff_name);
/* 调用相应的转换函数 */
while (!findnext(&list))
/* 查找匹配的下一个目录项 */
{
strcpy(dest,list.ff_name);
/* 转换成目标文件的文件名 */
strcpy(strchr(dest,'.'),fix[i]);
(* convert)(dest,list.ff_name);
/* 调用相应的转换函数 */
}
return(0);
}
/*****************************************************************************/
/* */
/* 入口参数 : */
/* dest char* 目标(BMP)文件的文件名 */
/* source char* 源(SPT)文件的文件名 */
/* */
/* 说明 : SPT文件应为单色非压缩模式,转换后的BMP文件为16色非压缩 */
/* 模式。 */
/* */
/*****************************************************************************/
void spttobmp(char *dest,char *source)
{
if (openfile(dest,source,&bmp,&spt)) return;
/* 打开源、目标文件 */
printf("\n%s=>%s ",source,dest);
prcdisp(-1); /* 产生百分数提示 */
fseek(spt,34,SEEK_SET); /* 读出 spt 文件图象宽度 */
fread(&width,2,1,spt);
fseek(spt,36,SEEK_SET); /* 读出 spt 文件图象高度 */
fread(&height,2,1,spt);
sptlinebyte=(width+7)/8; /* spt 文件中一行象素所占字节数 */
bmplinebyte=(((width+1)/2+3)/4)*4;
/* bmp 文件中一行象素所占字节数 */
length=0x76+bmplinebyte*height;
/* bmp 文件长度 */
memcpy(&bmphead[2],&length,4);
/* bmp 文件长度复制到 bmp 文件头 */
memcpy(&bmphead[18],&width,2);
/* 图象宽度复制到 bmp 文件头 */
memcpy(&bmphead[22],&height,2);
/* 图象高度复制到 bmp 文件头 */
fwrite(bmphead,0x76,1,bmp);
/* 写 bmp 文件头 */
bmponeline=malloc(bmplinebyte);
/* 为 bmp 文件的一行象素分配内存空间 */
sptoneline=malloc(sptlinebyte);
/* 为 spt 文件的一行象素分配内存空间 */
for(i=0;i<height;i++)
{
prcdisp((float)i*100/height);
/* 显示百分数提示 */
offset=64+sptlinebyte*(height-i-1);
/* 第height-i行象素在spt文件中的位置 */
fseek(spt,offset,SEEK_SET);
fread(sptoneline,sptlinebyte,1,spt);
/* 读入第height-i行象素 */
for(j=0;j<sptlinebyte;j++)
{
for(m=0,mask=0xc0;m<4;m++)
{
n=(sptoneline[j]&mask)>>(6-m*2);
/* 取出2bit(2个象素)数据 */
bmponeline[j*4+m]=colorpad[n];
/* 转换成2个象素的彩色值 */
mask>>=2;
}}
fwrite(bmponeline,bmplinebyte,1,bmp);
/* 把转换好的一行数据写入目标文件 */
}
prcdisp(100);
free(sptoneline); /* 释放内存 */
free(bmponeline);
fclose(bmp);
fclose(spt);
}
/*****************************************************************************/
/* */
/* 入口参数 : */
/* dest char* 目标(BMP)文件的文件名 */
/* source char* 源(SPT)文件的文件名 */
/* */
/* 说明 : BMP文件应为单色非压缩模式,转换后的SPT文件为单色非压缩 */
/* 模式。 */
/* */
/*****************************************************************************/
void bmptospt(char *dest,char *source)
{
if (openfile(dest,source,&spt,&bmp)) return;
fseek(bmp,18,SEEK_SET);
fread(&width,2,1,bmp); /* 读出 bmp 文件图象宽度 */
fseek(bmp,22,SEEK_SET);
fread(&height,2,1,bmp); /* 读出 bmp 文件图象高度 */
fseek(bmp,2,SEEK_CUR);
fread(&colornum,sizeof(int),1,bmp);
/* 读入彩色位数 */
if (colornum!=1)
{ /* 若不是单色位图格式 */
printf("Source file is not in 2-color format!\n");
fclose(bmp);
fclose(spt);
remove(dest);
return;
}
fread(&compress,sizeof(long int),1,bmp);
if (compress)
{ /* 若为压缩格式 */
printf("Source file is in compress format!\n");
fclose(bmp);
fclose(spt);
remove(dest);
return;
}
printf("%s=>%s ",source,dest);
prcdisp(-1); /* 产生百分数提示 */
bmplinebyte=sptlinebyte=((width+31)/32)*4;
/* spt和bmp文件中一行象素所占字节数 */
memcpy(&spthead[34],&width,2);/* 图象宽度复制到 bmp 文件头 */
memcpy(&spthead[36],&height,2);
/* 图象宽度复制到 bmp 文件头 */
fwrite(spthead,64,1,spt); /* 写 bmp 文件头 */
bmponeline=sptoneline=malloc(bmplinebyte);
/* 为 bmp 文件的一行象素分配内存空间 */
for(i=0;i<height;i++)
{
prcdisp((float)i*100/(height));
/* 显示百分数提示 */
offset=bmplinebyte*(i+1); /* 计算第i行象素在bmp文件中的偏移量 */
fseek(bmp,-offset,SEEK_END);
fread(bmponeline,bmplinebyte,1,bmp);
/* 读入第i行象素 */
fwrite(sptoneline,sptlinebyte,1,spt);
/* 写入spt文件 */
}
prcdisp(100); /* 显示百分数提示 */
free(bmponeline); /* 释放内存 */
fclose(bmp);
fclose(spt);
}
/*****************************************************************************/
/* */
/* 入口参数 : */
/* dest char* 目标(PIC)文件的文件名 */
/* source char* 源(BMP)文件的文件名 */
/* */
/* 说明 : BMP文件应为16色非压缩模式,转换后的PIC文件为16色压缩 */
/* 模式。 */
/* */
/*****************************************************************************/
void bmptopic(char * dest,char *source)
{
/* pic格式图象先把屏幕上第一行1-8个象素的彩色值进行转换,然后把 */
/* (4bit*8)位数据转换成4个字节,第1字节存放8个象素的第0位彩色值,第2字 */
/* 节存放8个象素的第1位彩色值……。第一行8个象素转换好后,再转换第二、 */
/* 第三行的1-8个象素,依次下去。1-8列象素全部转换好后,再转换9-16列象 */
/* 素。直到屏幕上所有象素点都转换好。于是一幅图象转换为四个数据块: */
/* 第一数据块存放所有象素的第一位彩色值,第二数据块存放所有象素的第二 */
/* 位彩色值, 依次下去。再对四个数据块按以下方法进行压缩:若数据块中 */
/* n(n<127)个连续字节相等, 则将n的最高位置为1, 然后输出n和该字节; 若 */
/* 遇到n个连续不等的字节, 则输出n和不等的n个字节。 */
FILE * tempfile[4]; /* 存放四个数据块的临时文件 */
farmem hp; /* 在远程堆上定义一数据块 */
char tempfilename[4][13];
printf("%s=>%s ",source,dest);
if (openfile(dest,source,&pic,&bmp)) return;
fseek(bmp,2,SEEK_SET);
fread(&length,sizeof(long),1,bmp);
/* 读入bmp源文件的长度 */
fseek(bmp,0x0a,SEEK_SET);
fread(&offset,sizeof(long int),1,bmp);
/* 读入位图数据在bmp文件中的偏移量 */
fseek(bmp,4,SEEK_CUR);
fread(&width,sizeof(long int),1,bmp);
/* 读入图象宽度 */
fread(&height,sizeof(long int),1,bmp);
/* 读入图象高度 */
fseek(bmp,2,SEEK_CUR);
fread(&colornum,sizeof(int),1,bmp);
/* 读入彩色位数 */
if (colornum!=4)
{
/* 若非16色位图格式 */
printf("Source file is not in 16-color format!\n");
fclose(bmp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -