标题:[求助]怎么获取64K色图形模式下的某点颜色值
只看楼主
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
我曾经想过但并未尝试过用扩展BGI在64K色下读取颜色值,但隐隐记得以前在老外的网站里看到过关于这方面的东西:好像是先置一下某个环境变量,然后用getpixel()连续读两次,就分别能得到高、低各8字节的信息,组合在一起就可以了。不过又好像是调用getpixel()后不用它返回的值,而是立即读寄存器_AX(也可能是_BX)的值,这里面保存有真正的16位颜色值。
第二种方法从逻辑上说的可能性大些,因为我实在记不清了,只能从逻辑上猜测了,因为程序运行离不开寄存器,graphics的内核应该会读到完整的颜色值放进里面,只是返回时迫于函数原型将值截断了。
楼主有时间可以试试,不过先申明我只是凭稀薄的印象回忆的,所以很可能只是我梦到的而没有任何的依据,所以没成功可别骂我哦。
2006-09-08 10:00
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
当然,你也可以从
setrgbpalette(1026, color.r >> 3, color.g >> 2, color.b >> 3);
putpixel(x, y, 0);
着手推断读颜色值的方法,上面说的第一个方法中可能是我将getrgbpalette()之类的函数错记成环境变量了也说不定,加油吧
2006-09-08 10:04
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
得分:0 

我改了改变量类型 然后显示后重显测试成功了
至于你那个方法我还要多研究一段日子(发现技术上有点限制
我现在先用这个:
unsigned int far *videoptr = (int far *)MK_FP(0xa000, 0);
unsigned int get64kdot(int x,int y)
{
long addr;
int page;

page = (int)((addr = (long)y *GRPAH_MAXX +(long)x) >> 15);

_BX = 0;
_DX =page;
_AX = 0x4f05;
__int__(0x10);

return *(videoptr + (unsigned)(addr & 0xffff));

}
所以非常感谢斑竹的帮助

2006-09-08 13:46
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
恩,负值那个事我忘了说了,负值是正常的,改成无符号整型就行了,在实际应用中不改也不会有太大的问题,给人看的时候换成16进制就没事了。
2006-09-08 13:56
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
在Jordan Hargraphix Software提供的SVGA BGI中,对于16bit色、24bit色和32bit色视频模式下,获取某个像素点的颜色值的方法如下:
DWORD color = 0;
getpixel(x, y);
color = _EAX;
颜色值被存放在了EAX寄存器中,如果在TC2.0中,编译器不支持EAX寄存器,以上代码是无法正常编译的,在TC3.0下是可以的。所以,在TC2.0下,要取得24bit色和32bit色的像素颜色值,较为困难,但是取得16bit色的颜色值是没有问题的:
WORD color = 0;
getpixel(x, y);
color = _AX;
从道理上讲,C语言中函数的返回值都是被放到AX或EAX中,所以如下写法也是对的:
WORD color = 0;
color = getpixel(x, y);






[此贴子已经被作者于2006-9-8 15:32:40编辑过]

2006-09-08 15:28
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 

原理是这样的,Jordan Hargraphix Software提供的BGI的getpixel函数的返回值实际上是32bit的,它将这个返回值放入了EAX寄存器,这也是C函数调用的通常做法,因此putpixel函数的正确的声明应该如下:
unsigned long far _Cdecl getpixel(int x, int y);
然而,在graphics.h中getpixel的函数原型为:
unsigned far _Cdecl getpixel(int x, int y);
其返回值是16bit的,所以编译器认为getpixel的返回值为16bit,并且放入了AX寄存器中。所以对于16bit色模式的返回值在TC2.0中是可以正常取得的,而对于24bit色和32bit色的颜色值,就只能取得其低16bit了,因为TC2.0中不支持EAX寄存器,并且graphics.h中getpixel函数声明的返回值也是16bit的。

在TC3.0种,可以访问EAX寄存器以下的写法对于16bit、24bit和32bit都是适用的:
DWORD color = 0;
getpixel(x, y);
color = _EAX;






[此贴子已经被作者于2006-9-8 15:33:24编辑过]

2006-09-08 15:29
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 

如果在支持32bit寄存器的编译器中对于32bit的返回值,都是放在EAX中的,不知道TC3.0 对于32bit的返回值是否是这样处理的,如果是的话,就可以采用如下的办法:
首先将getpixel的原型改为:
unsigned long far _Cdecl getpixel(int x, int y);
然后:
DWORD color = 0;
color = getpixel(x, y);

以上的说法,有一部分是我从理论上进行的推测,我也没有具体写代码去测试。(自己去测吧:-)


[此贴子已经被作者于2006-9-8 15:33:48编辑过]

2006-09-08 15:29
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 

结论:
TC2.0下不能取得24bit色和32bit色的像素值,可以取得16bit色的像素值,方法如下:
WORD color = 0;
getpixel(x, y);
color = _AX; // 绝对能行
或者:
WORD color = 0;
color = getpixel(x, y); // 理论上能行,我没有测试过

TC3.0下能够取得16bit色、24bit色、32bit色的像素值,方法如下:
DWORD color = 0;
getpixel(x, y);
color = _EAX; // 绝对能行
或者:
改getpixel函数原型为:unsigned long far _Cdecl getpixel(int x, int y);
然后如下:
DWORD color = 0;
color = getpixel(x, y); // 理论上能行,我没有测试



[此贴子已经被作者于2006-9-8 15:34:05编辑过]

2006-09-08 15:29
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 

另外setrgbpalette可以用来设置颜色是对setcolor函数的功能扩充,如下:
#define SET_DRAW_COLOR 1024
#define SET_FILL_COLOR 1025
#define SET_PIXEL_COLOR 1026
setrgbpalette(SET_DRAW_COLOR, r, g ,b); // 设置画笔颜色
setrgbpalette(SET_FILL_COLOR, r, g ,b); // 设置填充颜色
setrgbpalette(SET_PIXEL_COLOR, r, g ,b); // 设置putpixel函数所使用的颜色
16bit色、24bit色和32bit色下的绘点方法:
setrgbpalette(SET_PIXEL_COLOR, r, g ,b);
putpixel(x, y, 0);

如有问题可以进一步参考Jordan Hargraphix Software BGI的相关文档,在上面讲的非常清楚。(不过这个原始版本的BGI很难搞到的,我这里有一份,可是没法给你;-)。





[此贴子已经被作者于2006-9-8 15:34:32编辑过]

2006-09-08 15:30
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
抱歉,公司的电脑发帖子存在字数限制,所以只有分多次发出了。

[此贴子已经被作者于2006-9-8 15:36:06编辑过]


2006-09-08 15:30



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




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

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