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

📄 ch7.prg

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