标题:[求助]怎么获取64K色图形模式下的某点颜色值
只看楼主
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
结帖率:74.19%
 问题点数:0 回复次数:37 
[求助]怎么获取64K色图形模式下的某点颜色值

256 还是 16色图形模式下的某点颜色值用getpixel获取就行
可是在64K色的图形模式下这种方法肯定是不行的
那用什么方法能获取呢?

搜索更多相关主题的帖子: 64K色 图形 模式 颜色 获取 
2006-07-29 13:57
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 
你要读取颜色值,也只是直接读显存就可以了,LZ可以去看看NEO中的 get_dot() 函数,你马上就能明白到底是怎么做的

个人网站 -  http://.h001.
2006-07-29 19:40
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
得分:0 

最近才有时间弄这个~~


NEO里的那个我没弄明白!
我做了个程序,在没用NEO库下做的获取颜色,BZ看一下:
#include <dos.h>
#include <graphics.h>

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

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

void putpoint(int x, int y, rgb16M color)
{
setrgbpalette(1026, color.r >> 3, color.g >> 2, color.b >> 3);
putpixel(x, y, 0);
}

void init64k()
{
int gd=DETECT,gm=0;
installuserdriver("Svga64K", Return_SVGA64K);
initgraph(&gd, &gm, "");
}

main()
{
int x,y;
int page,get;
long addr;
rgb16M color;
int far *videoptr = (int far *)MK_FP(0xa000, 0);

init64k();
for(x=0;x<getmaxx();x++)
for(y=0;y<getmaxy();y++)
{
color.r=8;
color.g=3;
color.b=8;
putpoint(x,y,color);
}
x=123;
y=45;
page = (int)((addr = ((long)y + 0) * 640 + x) >> 15);

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

get=*(videoptr + (unsigned)(addr & 0xffff));

getch();
closegraph();
printf("%d",get);
getch();
}

好象的确获取了颜色值!
但是怎么把获取的那个颜色值转化回去啊?
怎么我改了好几个color值后获取的get值都是一样的?
例如:
color.r=1 把这个1改为0或者2~7 get都是0?
color.b=0
color.g=0

2006-09-01 17:09
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
因为color.r &gt;&gt; 3将分量压缩了,造成了几个原本不同的颜色值在实际运用中读出来的值却一样的情况。
2006-09-02 11:14
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
得分:0 

那就是说其实颜色种类并不是64K种拉!

2006-09-02 17:15
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
是啊,共65536种颜色:
color.r >> 3将颜色压缩了3个位,还剩下5位,能用来表示2的5次方级数的红色分量,共32级;
同样的color.g >> 2压缩了2位,还剩6位,就能表示2的6次方即64级绿色;
color.b >> 3可表示32级兰色。
三原色组合起来就是32 * 64 * 32 = 65536
这是具体的计算方法,其实两个字节的int型无符号变量本来就能表示2的16次方也就是65536个数嘛。
2006-09-04 15:58
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 

所以这个压缩是指将颜色从24位(真彩,R:G:B=8:8:8,共16777216色)转换成16位(高彩,R:G:B=5:6:5,共65536色),很明显这两个总数相差太大,所以最后每个高彩值都会和好几个真彩值相对应,也就是在真彩模式下能表现出来的颜色过渡细节在高彩下会丢失一些,因为每相邻接近的几级颜色都被压缩成了高彩中的一个,缺失掉了。

2006-09-04 16:03
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
得分:0 

多谢多谢!

但是这个问题也体现我的学习态度还是不好!
这个问题自己仔细算一下应该明白!

2006-09-04 17:07
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
得分:0 

郁闷
怎么在显示图片后获取的值是负值?!
2006-09-06 21:02
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
得分:0 

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

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

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

void putpoint(int x, int y, rgb16M color)
{
setrgbpalette(1026, color.r >> 3, color.g >> 2, color.b >> 3);
putpixel(x, y, 0);
}

void init64k()
{
int gd=DETECT,gm=0;
installuserdriver("Svga64K", Return_SVGA64K);
initgraph(&gd, &gm, "");
}

main()
{
int x,y;
unsigned int page,get;
long addr;
rgb16M color;
unsigned int far *videoptr = (int far *)MK_FP(0xa000, 0);

init64k();
for(x=0;x<getmaxx();x++)
for(y=0;y<getmaxy();y++)
{
color.r=31<<3;
color.g=63<<2;
color.b=0;
putpoint(x,y,color);
}
x=123;
y=45;
page = (int)((addr = ((long)y + 0) * 640 + x) >> 15);

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

get=*(videoptr + (unsigned)(addr & 0xffff));

getch();
closegraph();
printf("%u",get);
getch();
}

改进了一下

2006-09-06 21:26



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




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

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