注册 登录
编程论坛 C图形专区

在TC下显示24位BMP文件时发现的郁闷问题?

cdmalcl 发布于 2006-11-01 22:20, 1637 次点击

在TC下显示24位BMP文件时发现的郁闷问题:

int Draw_64k_View(char *Filename,int x0,int y0,int lucency )
{
int WIDTH, HEIGHT, fp;
long fix;

if((fp = open(Filename, O_RDONLY | O_BINARY)) == -1)
{
printf("Can't find File ""%s"".",Filename);
getch();
return 1;
}

WIDTH=GetWidth(fp);
HEIGHT=GetHeight(fp);

fix =(long)WIDTH %4;

lseek(fp, 54l+fix, SEEK_SET);

Draw_64k(fp,fix,x0,y0,WIDTH,HEIGHT - 1,lucency);

close(fp);
return 0;
}

为什么把lseek(fp, 54l+fix, SEEK_SET);改为
lseek(fp, 54l+fix-(WIDTH%4==2), SEEK_SET);才能正常显示图片啊

16 回复
#2
一笔苍穹2006-11-02 10:06
先把fix =(long)WIDTH %4;改成fix =(long)(WIDTH %4);
可能是你的偏移搞错了,参考一下WIN-TC里的“第三方BGI演示”。
#3
cdmalcl2006-11-02 12:36

那么改还是不行

就是参见它的做的

#4
cdmalcl2006-11-02 20:51
以下是引用cdmalcl在2006-11-1 22:20:55的发言:

在TC下显示24位BMP文件时发现的郁闷问题:

int Draw_64k_View(char *Filename,int x0,int y0,int lucency )
{
int WIDTH, HEIGHT, fp;
long fix;

if((fp = open(Filename, O_RDONLY | O_BINARY)) == -1)
{
printf("Can't find File ""%s"".",Filename);
getch();
return 1;
}

WIDTH=GetWidth(fp);
HEIGHT=GetHeight(fp);

fix =(long)WIDTH %4;

lseek(fp, 54l+fix, SEEK_SET);

Draw_64k(fp,fix,x0,y0,WIDTH,HEIGHT - 1,lucency);

close(fp);
return 0;
}

为什么把lseek(fp, 54l+fix, SEEK_SET);改为
lseek(fp, 54l+fix-(WIDTH%4==2), SEEK_SET);才能正常显示图片啊

不对是
lseek(fp, 54l+fix+(WIDTH%4==2), SEEK_SET);

#5
cdmalcl2006-11-02 20:54

#include <dos.h>
#include <stdio.h>
#include <fcntl.h>
#include <graphics.h>

typedef struct
{
unsigned char b;
unsigned char g;
unsigned char r;
}
rgb16M;

int GRPAH_MAXX;
int keep_page=0;

int huge Return_SVGA64K(void)
{
return(3);
}

void Init64k()
{
int gd=DETECT,gm=0;
installuserdriver("Svga64K", Return_SVGA64K);
initgraph(&gd, &gm, "");
GRPAH_MAXX=getmaxx()+1;
}

int putpoint(int x, int y, rgb16M color)
{
int page;

page = (int)((y*(long)GRPAH_MAXX +x) >> 15);
if(keep_page!=page)
{
_BX = 0;
_DX =page;
_AX = 0x4f05;
__int__(0x10);
keep_page=page;
}
setrgbpalette(1026, color.r >> 3, color.g >> 2, color.b >> 3);
putpixel(x, y, 0);
}

int Draw_64k(int fp ,long jump ,int draw_x ,int draw_y ,int width_x,int height_y ,int lucency)
{
int i,j;
rgb16M *buffer;

buffer = (rgb16M *)malloc(width_x*sizeof(rgb16M));
for(j = height_y-1; j >= 0; j--)
{
read(fp, buffer, width_x*sizeof(rgb16M));

for(i = 0; i < width_x; i++)
if(buffer[i].b+buffer[i].g+buffer[i].r+lucency) putpoint(draw_x + i, draw_y + j, buffer[i]);
lseek(fp, jump, SEEK_CUR);
}
free(buffer);
}

int Draw_64k_View(char *Filename,int x0,int y0,int lucency )
{
int WIDTH, HEIGHT, fp;
long fix;

if((fp = open(Filename, O_RDONLY | O_BINARY)) == -1)
{
printf("Can't find File ""%s"".",Filename);
getch();
return 1;
}

WIDTH=GetWidth(fp);
HEIGHT=GetHeight(fp);

fix =(long)(WIDTH % 4);

lseek(fp, 54l+fix+(WIDTH%4==2), SEEK_SET);

Draw_64k(fp,fix,x0,y0,WIDTH,HEIGHT,lucency);

close(fp);
return 0;
}

int GetWidth(int fp)
{
long WIDTH;

lseek(fp, 18l, SEEK_SET);
read(fp, &WIDTH, 4);

return WIDTH;
}

int GetHeight( int fp)
{
long HEIGHT;

lseek(fp, 22l, SEEK_SET);
read(fp, &HEIGHT, 4);

return HEIGHT;
}

main()
{
Init64k();
Draw_64k_View("sssssss.bmp",0,0,0);getch();
Draw_64k_View("胜利.bmp",0,0,0);getch();

}

这是我写的显示程序
是不是其他的地方出的错啊
还是文件格式就是我说的那样???

#6
一笔苍穹2006-11-03 10:41

我编译执行了程序,一闪而过,什么都看不到,立马关闭了。你先查查。

#7
cdmalcl2006-11-03 12:46

不能吧!!
我那运行挺正常的啊!
我是复制粘贴过来的

你在你那是是哪个程序段出现的运行断点啊?
不会是图形模式初始化吧
#8
一笔苍穹2006-11-03 15:56
我也是复制粘贴下来的啊,编译连接不报错,只是执行窗口一闪而过,用小一张的图片,100X100左右的就不会马上关闭,但也看不到显示结果。我在上班,没时间多调了,你多发给几个人试试。
#9
cdmalcl2006-11-04 09:08

发给很多人试过
都是一闪而过
而且都是在图形初始化的那一步
难道吴进的图形驱动有限制么?

#10
一笔苍穹2006-11-04 10:47
这就不太清楚了,这些第三方BGI可能兼容性是不如原来的EAG_VGA的好,我以前也用它做过一个叫lizard的图形扩展库,但由于性能不佳最后并没放出来让大家测试过,而是另写了NEO,所以不知道它的兼容性到底如何,我是GFORCE 5200的卡子,你问问那些出问题的机子是什么卡子。另外也可以查查程序是否有内存方面的BUG。
#11
ChenMo2006-11-05 11:55

程序中注册了新的驱动 Svga64K,
将 Svga64K 的驱动放到源程序下就没问题了。
吴进兄的 Svga64K 驱动是 Svga64k.bgi,
这份驱动在 Win-TC 的“projects\第三方BGI演示”这个目录下,
拷它出来放到你的程序下就能运行了。

#12
ChenMo2006-11-05 11:56
准确地说,应该将 Svga64.bgi 与源程序编译出来的 EXE 文件放在同一个目录下。

[此贴子已经被作者于2006-11-5 12:02:14编辑过]


#13
ChenMo2006-11-05 12:01
程序没错,没有将 Svga64.bgi 放在程序的同一目录下,
运行后提示的信息是“BGI 错误:图形尚未被初始化”,
需要手工使用控制台(cmd)来运行编译出来的 EXE 文件才能看到这条。
#14
cdmalcl2006-11-05 14:05

这个我自然知道啊
别人帮我调试的时候我都再三告诉他要放在一个文件夹里
但是还是有人说不能驱动起来 可能和显示器有关吧
驱动程序如果没问题的话那我想知道的是我的图片显示的对不对啊
24位BMP图片文件可是到底是什么?

#15
ChenMo2006-11-05 14:18
我自己画了一张鬼脸(24位BMP),正常显示。
还放了一张美女图(24位BMP),也能正常显示。

可能是显卡的问题。
#16
cdmalcl2006-11-05 15:36
可能吧
他们几个显示不出来的我都没问什么显卡

我的程序的确有问题
用 第三方BGI演示 里的程序试那两个图片的确没问题
我再去看看
#17
一笔苍穹2006-11-06 10:13

将BGI和EXE放在一个文件夹下是肯定的,我也这么做了。

1