yuleol 发表于 2006-7-13 13:21

关于TC显示BMP图像

<P>我知道可以用getimage()函数来保存屏幕上的一块图像,然后用putimage()函数输出这个图像!~~<BR><BR>我想问一下,有什么办法能把bmp文件读到内存后,然后用putimage()输出呢?<BR><BR>我看过了<a href="http://bbs.bc-cn.net/bbs/dispbbs.asp?boardid=5&amp;id=7603&amp;star=1" target="_blank" >http://bbs.bc-cn.net/bbs/dispbbs.asp?boardid=5&amp;id=7603&amp;star=1</A>这个贴子关于BMP格式的一些介绍,但还是不太明白~<BR><BR>希望给我个例子~</P>

一笔苍穹 发表于 2006-7-13 22:37

<P>#include "stdio.h"<BR>#include "dir.h"<BR>#include "dos.h"<BR>#include "graphics.h"</P>
<P>char *malloc();/*malloc转换*/</P>
<P>char bmp_to_dat(char *bmp,char *dat)<BR>/*将16色BMP文件转换为可以用putimage输出的格式,bmp为原BMP文件,dat为转化文件*/<BR>{unsigned char c[8],scan_times,scan_pixs;<BR> unsigned char workpos;int i,j,k,n,nowpos,iw,ih;<BR> static int color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};<BR> unsigned char workline[640],scanline[640];<BR> FILE *fp,*targetfp;<BR> union<BR> {unsigned char value;<BR>  struct<BR>  {unsigned cl:4;<BR>   unsigned ch:4;<BR>  }color;<BR> }mycolor;</P>
<P> if((fp=fopen(bmp,"rb"))==NULL)return(0);<BR> targetfp=fopen(dat,"wb");</P>
<P> fseek(fp,18,SEEK_SET);<BR> iw=0;ih=0;<BR> fread(&amp;iw,4,1,fp);        /*读图像宽度*/<BR> fread(&amp;ih,4,1,fp);        /*读图像高度*/<BR> if(iw==0&amp;&amp;ih==0&amp;&amp;iw&gt;640&amp;&amp;ih&gt;480)<BR> {fclose(fp);fclose(targetfp);return(0);}</P>
<P> iw--;ih--;            /*∵putimage中的长宽比实际数值少1*/<BR> scan_times=iw/8+1;        /*行处理单位数*/<BR> scan_pixs=scan_times*4;        /*行像素字节数∵1单位=4字节*/</P>
<P> fputc(iw%256,targetfp);        /*填充信息头:长、宽部分*/<BR> fputc(iw/256,targetfp);<BR> fputc(ih%256,targetfp);<BR> fputc(ih/256,targetfp);<BR> fseek(fp,-scan_pixs,SEEK_END);</P>
<P> for(j=0;j&lt;=ih;j++)<BR> {nowpos=0;<BR>  fread(scanline,scan_pixs,1,fp);<BR>  fseek(fp,-scan_pixs*2,SEEK_CUR);<BR>  for(n=3;n&gt;=0;n--)        /*解码4个位面*/<BR>  {for(i=0;i&lt;scan_times;i++)    /*解码各编码单位*/<BR>   {workpos=0;<BR>    for(k=0;k&lt;4;k++)        /*分离出8个像素*/<BR>    {mycolor.value=scanline[i*4+k];<BR>     c[k*2]=color[mycolor.color.ch];<BR>     c[k*2+1]=color[mycolor.color.cl];<BR>    }<BR>    for(k=0;k&lt;8;k++)workpos+=(c[k]&gt;&gt;n&amp;1)&lt;&lt;(7-k);<BR>    workline[nowpos]=workpos;nowpos++;<BR>  }}<BR>  fwrite(workline,scan_pixs,1,targetfp);<BR> }<BR> fclose(fp);fclose(targetfp);<BR> return(1);<BR>}</P>
<P>main()<BR>{int gd=VGA,gm=VGAHI,n;<BR> char *buffer,bmpfile[13],_16file[13]={0};<BR> FILE *fp;<BR> struct ffblk *ff;<BR> initgraph(&amp;gd,&amp;gm,"");<BR> strcpy(bmpfile,"mm.bmp");<BR>strncpy(_16file,bmpfile,strlen(bmpfile)-3);<BR> strcat(_16file,"dat");<BR> if(!bmp_to_dat(bmpfile,_16file))<BR> {puts("File Error!");closegraph();exit(0);}<BR> fp=fopen(_16file,"rb");<BR> findfirst(_16file,ff,FA_ARCH);<BR> if((buffer=malloc(ff-&gt;ff_fsize))==NULL)exit(0);<BR> n=0;<BR> while(!feof(fp))<BR> {buffer[n]=fgetc(fp);<BR>  n++;<BR> }<BR> putimage(63,5,buffer,COPY_PUT);<BR> getch();<BR> closegraph();<BR> free(buffer);<BR> fclose(fp);<BR>}</P>

一笔苍穹 发表于 2006-7-13 22:38

可以将16色位图转换为GRAPHICS的内部格式。

yuleol 发表于 2006-7-13 23:02

<P>先谢了,慢慢研究一下~</P>

vfdff 发表于 2006-8-11 03:49

<P>谢谢斑竹的支持 <BR>但是请问您所要的 bmp图片有什么要求 <BR>因为我试拉下 <BR>好想不呢功能正常显示 bmp图片</P>

一笔苍穹 发表于 2006-8-11 13:56

对BMP的要求就是要不大于分辨率尺寸的,并且是16色的图片,LZ可以下个不错的图形处理小工具XNVIEW,用以将真彩图片转换成16色位图。

vfdff 发表于 2006-8-11 17:55

我的 油箱是 vfdff@tom.com<BR><BR>你能给张图片 看看 到底显示的效果怎么样吗 ??<BR>因为我实在想不通<BR>我甚至用黑白图片 <BR>竟然也提示要求只对 16色的 图片显示 ,而无法显示<BR><BR>麻烦斑竹拉!!

vfdff 发表于 2006-8-12 01:19

<DIV class=quote><B>以下是引用<U>一笔苍穹</U>在2006-8-11 13:56:52的发言:</B><br>对BMP的要求就是要不大于分辨率尺寸的,并且是16色的图片,LZ可以下个不错的图形处理小工具XNVIEW,用以将真彩图片转换成16色位图。</DIV>
<P>请问 为什么 我用这个软件转成 16色的图片 后,看起来仍来很鲜艳(用系统上的图形软件打开)<br>但是用这个程序显示出来就不好看拉,<br>到底是本来就应该这样 吗??<br><br>另外请教下 <br>怎么看这个图片是 多少色的呢 ??</P>
[align=right][color=#000066][此贴子已经被作者于2006-8-12 1:28:21编辑过][/color][/align]

一笔苍穹 发表于 2006-8-12 11:30

你如果在用XNVIEW的话,在最底下的状态栏会有色深信息的。你上面所说的情况可以用抖动转换试试,而不要用适应转换。

vfdff 发表于 2006-8-15 12:48

但是在 抖动转换方式下 转化的图片显示 黑白色还挺好的<br>但是 到 彩色的时候 ,整片的同色图是一个不是完整的连续面<br>中间会有方格线,而且这个方格线还不是透明的<br><br>而 用适应的时候我能显示彩色的,而且整片的同色图是一个完整的连续面<br><br>不知道什么原因  ??
[align=right][color=#000066][此贴子已经被作者于2006-8-15 13:01:20编辑过][/color][/align]

一笔苍穹 发表于 2006-8-15 13:10

不会啊,可能是你的图片问题吧,换张图试试,我这边没有这种问题。<BR>有些图可以先适应转换到16色,再抖动转一次,效果会更好些,注意:只是有些~

lulu199 发表于 2007-9-15 11:53

<a href="http://blog.csdn.net/cifry/archive/2007/09/14/1784448.aspx" target="_blank" >http://blog.csdn.net/cifry/archive/2007/09/14/1784448.aspx</A>

页: [1]

编程论坛