151.动态显示位图

简介: 151.动态显示位图
#include "stdio.h"
#include "dir.h"
#include "dos.h"
#include "graphics.h"
char *malloc();/*malloc转换*/
char bmp_to_dat(char *bmp,char *dat)
/*将16色BMP文件转换为可以用putimage输出的格式,bmp为原BMP文件,dat为转化文件*/
{
  unsigned char c[8],scan_times,scan_pixs;
  unsigned char workpos;int i,j,k,n,nowpos,iw,ih;
  static int color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};
  unsigned char workline[640],scanline[640];
  FILE *fp,*targetfp;
  union
  {
    unsigned char value;
    struct
    {
      unsigned cl:4;
      unsigned ch:4;
    }color;
  }mycolor;
  if((fp=fopen(bmp,"rb"))==NULL)return(0);
  targetfp=fopen(dat,"wb");
  fseek(fp,18,SEEK_SET);
  iw=0;ih=0;
  fread(&iw,4,1,fp);    /*读图像宽度*/
  fread(&ih,4,1,fp);    /*读图像高度*/
  if(iw==0&&ih==0&&iw>640&&ih>480)
  {fclose(fp);fclose(targetfp);return(0);}
  iw--;ih--;      /*∵putimage中的长宽比实际数值少1*/
  scan_times=iw/8+1;    /*行处理单位数*/
  scan_pixs=scan_times*4;   /*行像素字节数∵1单位=4字节*/
  fputc(iw%256,targetfp);   /*填充信息头:长、宽部分*/
  fputc(iw/256,targetfp);
  fputc(ih%256,targetfp);
  fputc(ih/256,targetfp);
  fseek(fp,-scan_pixs,SEEK_END);
  for(j=0;j<=ih;j++)
  {nowpos=0;
  fread(scanline,scan_pixs,1,fp);
  fseek(fp,-scan_pixs*2,SEEK_CUR);
  for(n=3;n>=0;n--)   /*解码4个位面*/
  {for(i=0;i<scan_times;i++)  /*解码各编码单位*/
  {workpos=0;
    for(k=0;k<4;k++)    /*分离出8个像素*/
    {mycolor.value=scanline[i*4+k];
  c[k*2]=color[mycolor.color.ch];
  c[k*2+1]=color[mycolor.color.cl];
    }
    for(k=0;k<8;k++)workpos+=(c[k]>>n&1)<<(7-k);
    workline[nowpos]=workpos;nowpos++;
  }}
  fwrite(workline,scan_pixs,1,targetfp);
  }
  fclose(fp);fclose(targetfp);
  return(1);
}
main()
{
  int gd=VGA,gm=VGAHI,n;
  char *buffer,bmpfile[13],_16file[13]={0};
  FILE *fp;
  struct ffblk *ff;
  /*registerbgidriver(EGAVGA_driver);*/
  initgraph(&gd,&gm,"C:\\tc");
  printf("Now start to display 16 color bmp.\n\n");
  puts("Please choice: ");
  printf("0. Quit \n1. BMP file name\n");
  while(1)
  {
    n=getch();
    switch(n)
    {
    case 0  :continue;
    case '0':exit(0);
    case '1':
      {
        printf("Please input BMP file name(*.bmp):");
        gets(bmpfile);
        goto OUT;
      }
    }
  }
OUT:
  strncpy(_16file,bmpfile,strlen(bmpfile)-3);
  strcat(_16file,"dat");
  if(!bmp_to_dat(bmpfile,_16file))
  {
    puts("Can't open file!");
    closegraph();
    exit(0);
  }
  fp=fopen(_16file,"rb");
  findfirst(_16file,ff,FA_ARCH);
  if((buffer=malloc(ff->ff_fsize))==NULL)exit(0);
  n=0;
  while(!feof(fp))
  {
    buffer[n]=fgetc(fp);
    n++;
  }
  for(n=0;n<100;n++)
  {
    putimage(350-n,n/2,buffer,COPY_PUT);
  }
  getch();
  closegraph();
  free(buffer);
  fclose(fp);
}
相关文章
|
分布式计算 安全 Hadoop
HBase启动时有进程webUI不显示HRegionServer各种情况解决方案
HBase启动时有进程webUI不显示HRegionServer各种情况解决方案
760 0
|
存储 安全
office软件2016版本下载安装教程——office全版本软件安装包
office软件2016版本下载安装教程——office全版本软件安装包
1127 0
|
SQL 缓存 Oracle
为什么阿里巴巴禁止使用 count(列名)或 count(常量)来替代 count(*)
本文介绍了COUNT函数的用法,主要用于统计表行数。主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。
12830 0
为什么阿里巴巴禁止使用 count(列名)或 count(常量)来替代 count(*)
|
前端开发 NoSQL Redis
大文件上传:秒传、断点续传、分片上传
大文件上传:秒传、断点续传、分片上传
3226 2
|
12月前
|
IDE Shell Go
真香,Cursor懂的都懂(学习用哈),22.5k一键重置Cursor试用限制!被全网疯狂收藏!
go-cursor-help是一款用 Go 编写的开源工具,可在 3 秒内刷新 Cursor IDE 的机器码,绕过试用限制。支持 Windows、macOS 和 Linux,具备跨平台兼容性,自动配置系统架构。核心功能包括一键重写 `storage.json`、可选随机化 MAC 地址、禁用 Updater 避免版本升级干扰,以及内置历史版本回滚机制。
3057 1
|
9月前
|
人工智能 算法 数据库
给AI装上一个'超级大脑':信息检索如何改变RAG系统的游戏规则
从传统检索方法到现代向量检索,通过一个购物助手的故事,直观展示了不同检索技术的原理与应用。学会这些技巧,让你的AI不再是「记忆只有金鱼长度」的大模型!
395 24
|
JavaScript
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
这篇文章详细介绍了Vue路由中的query参数、命名路由、params参数以及props配置的使用方式,并通过实际项目案例展示了它们在开发中的应用和测试结果,同时解释了`<router-link>`的`replace`属性如何影响浏览器历史记录。
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
|
IDE 机器人 开发工具
基于ESP32的机器狗
基于ESP32的机器狗
589 0
|
存储 前端开发 JavaScript
为什么0.1 + 0.2 不等于 0.3 ?
这篇编程技术文章探讨了为什么在多种编程语言中,0.1 + 0.2 不等于 0.3 的现象。问题源于计算机使用二进制浮点数表示小数,而二进制无法精确表示某些十进制分数,如 0.1 和 0.2。这导致它们在计算机内部被近似表示,从而在相加时产生微小误差。文章通过示例和图片解释了二进制浮点数的表示原理,并提供了将小数转换为整数再相加以及使用 `toFixed()` 方法或 decimal.js 库等解决精度问题的方法。
507 2