标题:关于用TC编程引用256色BMP图像的问题,急,希望高手不吝赐教。
取消只看楼主
adherentf
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-4-22
 问题点数:0 回复次数:0 
关于用TC编程引用256色BMP图像的问题,急,希望高手不吝赐教。
正在用TC做一个飞行射击类的游戏, 写了一个用于调用图片的函数quoteimage(),在程序中调用这个函数可以成功,256色的BMP图像可以正确显示,但是运行这个函数结束之后就会马上跳出(无论后面是什么代码都会跳出,cleardevice()也会跳出,printf()也会跳出)  然后按alt+f5查看最后结果的时候出现下图,求问大神解答一下。谢谢了。如果方便的话可以加我的QQ1060896195。

问过老师了,他说大概是内存写越界的问题,让我自己修改……
在百度上问过( http://zhidao.baidu.com/question/148351937.html )也没有结果。如果知道解决方法的话可以上去说,我在上面悬赏了200分的,解决了的话还会加。

1.我的系统是win7,所以是用dosbox来运行TC的,即使在XP系统下编译也是会出现一样的问题,所以应该是和系统无关的。
2.quoteimage()的代码我贴在图片下面。我调试过,发现:  我在调用这个函数之前就调用过一个InitializeGraph()函数来初始化图像(256色的VGA),然后如果我在quoteimage()函数后面再用InitializeGraph()函数初始化图像一次的话,那就不会跳出,后面的代码段也可以正常运行。
  所以我觉得应该是qtimage()函数里面有些问题。

void InitializeGraph(void)
{
    union REGS r;
    r.x.ax=0x4f02;
    r.x.bx=0x101;
    int86(0x10,&r,&r);
}


quoteimage()代码如下:
#include "plane.h"
/*换页函数*/
#include "plane.h"
/*换页函数*/
void selectpage(register char page)
{
 union REGS r;

 r.x.ax=0x4f05;
 r.x.bx=0;
 r.x.dx=page;            /*选择页面*/
 int86(0x10,&r,&r);
}


/*设置调色板*/
void set_SVGA_palette(unsigned char r[],  unsigned char g[], unsigned char b[])
{
 int  k;
  for (k = 0; k < 256; k++) {
    outportb(0x03C8,k);
  outportb(0x03C9,r[k]>>2);
  outportb(0x03C9,g[k]>>2);
  outportb(0x03C9,b[k]>>2);
 }
}

void quoteimage(char *imagefile)
{
     BITMAPFILEHEADER    FileHeader;
     BITMAPINFOHEADER    bmiHeader;
     RGBQUAD             bmiColors[256];
     unsigned char       buffer[1024], r[256], g[256], b[256];
     unsigned int  width, height, linebytes;
     long   offset, position;
     char page_new=0,page_old=0;
     int i,j,k,n,savemode;
     FILE *fp;
  int COLS=640;
  int ROWS=480;


     if((fp=fopen(imagefile,"rb"))==NULL) /*判断打开文件是否正确*/
     {
     printf("error:Can't open file: %s",buffer);
      exit(1);
     }

     if (fread((char *)&FileHeader, sizeof(FileHeader), 1, fp) != 1) {
        printf("error: Can't read file header !\n"); /* 读文件头 */
        exit(1);
     }
     if (FileHeader.bfType != 0X4D42) {  /* BM */
        fprintf(stderr, "error: Not a BMP file !\n");
        exit(1);
     }

     if (fread((char *)&bmiHeader, sizeof(bmiHeader), 1, fp) != 1) {
        fprintf(stderr, "error: Can't read bmiHeader !\n"); /* 读信息头 */
        exit(1);
     }
     if (bmiHeader.biBitCount > 8) { /* 不能显示真彩色图像 */
        fprintf(stderr, "error: Can not display ture color image !\n");
        exit(1);
     }
     if (bmiHeader.biCompression != 0) { /* 不能处理压缩图像 */
        fprintf(stderr, "error: Not non-compressed image !\n");
        exit(1);
     }

     width = (unsigned int)bmiHeader.biWidth;
     height = (unsigned int)bmiHeader.biHeight;
     linebytes = ((width*(long)bmiHeader.biBitCount+31)/32)*4; /* 每行字节数--4的整数倍 */

     if (fread((char *)&bmiColors[0], 4, 256, fp) != 256) { /* 读调色板数据 */
        fprintf(stderr, "error: Can't get palette !\n");
        return;
     }
for (i = 0; i < 256; i++) {
        r[i] = bmiColors[i].rgbRed;
        g[i] = bmiColors[i].rgbGreen;
        b[i] = bmiColors[i].rgbBlue;
     }
     set_SVGA_palette(r, g, b); /* 设置调色板 */

     offset = FileHeader.bfOffBits;
     fseek(fp, offset, SEEK_SET);    /* 跳到位图数据的起始位置 */
     for(j=height-1;j>=0;j--) {
  fread(buffer,linebytes,1,fp);
     for(i=0,n=0;i<width;i++,n++) {
     position=j*(long)COLS+i; /*计算要显示点的显存位置*/
     page_new=position/65536l; /*计算显示页*/
     if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
     {
      selectpage(page_new);
      page_old=page_new;
     }
     pokeb(0xa000,position%65536l,buffer[n]); /*写到显存位置*/
  }
  }
     fclose(fp);
}
搜索更多相关主题的帖子: BMP 图像 不吝 
2010-04-22 10:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-303993-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.593366 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved