| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3719 人关注过本帖
标题:[求助]怎么获取64K色图形模式下的某点颜色值
取消只看楼主 加入收藏
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
结帖率:74.19%
收藏
 问题点数:0 回复次数:11 
[求助]怎么获取64K色图形模式下的某点颜色值

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

搜索更多相关主题的帖子: 64K色 图形 模式 颜色 获取 
2006-07-29 13:57
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
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

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

2006-09-02 17:15
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
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
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

太感动了!!!
2006-09-08 16:28
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
以下是引用一笔苍穹在2006-9-8 16:49:37的发言:
呵呵,感谢RockCarry的及时出现,这下就印证在getpixel()之后读取寄存器_AX值是没错的了,希望cdmalcl的作品及早问世,记得发一份上来哦~

一定一定
绝对不副众望

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

终于研究出来了
最近心情不是很好 事还多 所以一直没多弄 拖多了今天

int GRPAH_MAXX;

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)/*画点(x,y)*/
{
int page;

page = (int)((y*(long)GRPAH_MAXX +x) >> 15);
_BX = 0;
_DX =page;
_AX = 0x4f05;
__int__(0x10);

setrgbpalette(1026, color.r >> 3, color.g >> 2, color.b >> 3);
putpixel(x, y, 0);
}

unsigned int far *videoptr = (int far *)MK_FP(0xa000, 0);
unsigned int get64kdot(int x,int y)/*获取(x,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));

}

rgb16M get_rgb_dot(int x,int y)/*获取颜色分量*/
{
rgb16M color_rgb;
unsigned int color;

color=get64kdot(x,y);
color_rgb.r=(color/2048)<<3;
color_rgb.g=((color%2048)/32)<<2;
color_rgb.b=((color%2048)%32)<<3;

return color_rgb;
}

2006-09-09 22:22
快速回复:[求助]怎么获取64K色图形模式下的某点颜色值
数据加载中...
 
   



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

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