编程论坛's Archiver

jolly_w 发表于 2006-11-30 21:44

[求助]VGA16色下用的是哪几个色彩寄存器啊?

    看到过一篇文章,引其中的一段:<BR>"不是说16色模式下只需要部分色彩寄存器吗?对于TC的BGI的EGA/VGA16色模式,所采用的颜色号在其graphics.h中是这样定义的:<BR>char ega_colors[16]={0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63};"<BR><BR>又看到过这样的程序,(吴进的16色位图显示)引其中的一段:<BR>"char convert[16] = {0x0,0x4,0x2,0x6,0x1,0x5,0x3,0x7,0x8,0xc,0xa,0xe,0x9,0xd,0x3,0xf};/*BMP色彩与VGA色对照表*/ "<BR>//这个注解不明白了和.<BR><BR>.......<BR>.......<BR><BR>" putpixel(x+j++,y+i,convert[bmp_data[d]&gt;&gt;4]);/*用高4位画1个点*/<BR>putpixel(x+j++,y+i,convert[bmp_data[d]&amp;0xf]); /*用低4位画1个点*/   "<BR><BR>//又用到convert了.<BR><BR><BR>上面的这个数组是什么意思我就不明白了.<BR>

jolly_w 发表于 2006-12-1 20:23

<P>/***********************************************<BR>  *******在DOS下显示16位色位图源程序**************<BR>  ***********************************************/<BR>     #include &lt;string.h&gt;<BR>     #include &lt;stdio.h&gt;<BR>     #include &lt;stdlib.h&gt;<BR>     #include &lt;conio.h&gt;<BR>     #include &lt;math.h&gt;<BR>     #include &lt;fcntl.h&gt;<BR>     #include &lt;bios.h&gt;<BR>     #include &lt;dos.h&gt;<BR>     #include &lt;io.h&gt;<BR>     #include &lt;graphics.h&gt;<BR>     #define closegr closegraph<BR>  /***********************************************<BR>  *************位图文件头结构*********************<BR>  ***********************************************/<BR>  typedef struct<BR>  {<BR>   int id; /*两字节的内容用来识别位图的类型:<BR>'BM' : Windows 3.1x, 95, NT, …<BR>'BA' :OS/2 Bitmap Array<BR>'CI' :OS/2 Color Icon<BR>'CP' :OS/2 Color Pointer<BR>'IC' : OS/2 Icon<BR>'PT' :OS/2 Pointer<BR>注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识"BM"就行<BR>*/<BR>   long filesize; /*用字节表示的整个文件的大小*/<BR>   long reserved; /*保留,必须设置为0*/<BR>   long dataoffset; /*从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量*/<BR>   long headersize; /*位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:<BR>28h - Windows 3.1x, 95, NT, …<BR>0Ch - OS/2 1.x<BR>F0h - OS/2 2.x<BR>注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。<BR>*/<BR>   long width; /*位图的宽度,以象素为单位*/<BR>   long height;/*位图的高度,以象素为单位*/<BR>   int Planes; /*位图的位面数(注:该值将总是1)*/<BR>   int Pixe;   /*每个象素的位数<BR>1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)<BR>4 - 16 色位图<BR>8 - 256 色位图<BR>16 - 16bit 高彩色位图<BR>24 - 24bit 真彩色位图<BR>32 - 32bit 增强型真彩色位图<BR>*/<BR>   long Compression;    /*压缩说明:<BR>0 - 不压缩 (使用BI_RGB表示)<BR>1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)<BR>2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)<BR>3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)<BR>*/<BR>   long bmpDataSize; /*用字节数表示的位图数据的大小。该数必须是4的倍数*/<BR>   long XPelsPerMeter;/*用象素/米表示的水平分辨率*/<BR>   long YPelsPerMeter;/*用象素/米表示的垂直分辨率*/<BR>   long ClrUsed; /*位图使用的颜色数。如8-比特/象素表示为100h或者 256*/<BR>   long ClrImportant;   /*指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要*/<BR>  }BMPHEAD;<BR>  BMPHEAD BmpHead;<BR>  //char convert[16] = {0x0,0x4,0x2,0x6,0x1,0x5,0x3,0x7,0x8,0xc,0xa,0xe,0x9,0xd,0x3,0xf};/*BMP色彩与VGA色对照表*/<BR>  <BR>  unsigned char * bmp_data;<BR>  int fp;</P>
<P>   /**********************************************<BR>   ************ BGI初始化函数*********************<BR>   **********************************************/<BR>  void initgr(void)<BR>{<BR>  int gd = DETECT, gm; /* 和gd = VGA,gm = VGAHI是同样效果 */<BR> // registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */<BR>  initgraph(&amp;gd, &amp;gm, "<a>\\tc\\bgi</A>");<BR>}<BR>  /***********************************************<BR>  *************位图文件头读取函数*****************<BR>  ***********************************************/<BR>  int read_bmp_head(char *bmp_filename)<BR>  {<BR>    if((fp=open(bmp_filename,O_RDONLY))==-1)/*打开位图文件*/<BR>    {<BR>      printf("%s%s",bmp_filename," is not found.");<BR>      return 1;<BR>    }<BR>    read(fp,&amp;BmpHead,sizeof(BMPHEAD));/*读取BMP文件的信息头*/<BR>    if(BmpHead.id!=0x4d42)  /*判断是否是BMP文件*/<BR>    {<BR>      printf("%s%s","'",bmp_filename,"' is not BMPfile");<BR>      return 1;<BR>    }<BR>    return 0;<BR>  }<BR>  /***********************************************<BR>  **************纠正宽度函数**********************<BR>  ***********************************************/<BR>    int correct_width(int width)<BR>  {<BR>    int factual_width;<BR>    if(width%4==0&amp;&amp;(width/4)%2==0);<BR>    else while(width%4!=0||(width/4)%2!=0)width++;<BR>    /*{<BR>    if(width%2)width+=2*(4-(width/2)%4);<BR>    else width+=2*(4-(width/2+1)%4);<BR>    } */<BR>    factual_width=width;<BR>    return factual_width;<BR>  }<BR>  /***********************************************<BR>  *************读位图文件并显示函数***************<BR>  ***********************************************/<BR>  void put_bmp(char * bmpfile,int x,int y)<BR>  {<BR>    int read_bmp_head_return,i,j,d=0,cn;<BR>    bmp_data=(unsigned char *)malloc(BmpHead.bmpDataSize*sizeof(unsigned char));<BR>    if((read_bmp_head_return=read_bmp_head(bmpfile))==1)<BR>    {<BR>      getch();<BR>      exit(1);<BR>      }<BR>    lseek(fp,BmpHead.dataoffset,SEEK_SET);<BR>    read(fp,bmp_data,BmpHead.bmpDataSize);/*读取颜色数据到缓冲区内*/<BR>    cn=correct_width(BmpHead.width);<BR>    for(i=BmpHead.height;i&gt;0;i--)<BR>    for(j=0;j&lt;cn;)<BR>    {<BR>      putpixel(x+j++,y+i,convert[bmp_data[d]&gt;&gt;4]);/*用高4位画1个点*/<BR>      putpixel(x+j++,y+i,convert[bmp_data[d]&amp;0xf]); /*用低4位画1个点*/<BR>      d++;<BR>    }<BR>    free(bmp_data);<BR>    close(fp);<BR>  }<BR>  /***********************************************<BR>  *************主函数*****************************<BR>  ***********************************************/<BR>  int main(void)<BR>  {<BR>    initgr();<BR>    put_bmp("aa16.bmp",320,240);<BR>    getch();<BR>    closegr();<BR>    return 0;<BR>  }<BR>这是源程序,可是在tc下怎么显示16色图像时去是一堆乱的东西?</P>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.