⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch7.prg

📁 C 常用算法程序集 徐士良 编 清华大学出版社 1994.1
💻 PRG
📖 第 1 页 / 共 4 页
字号:
  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 + -