256 还是 16色图形模式下的某点颜色值用getpixel获取就行
可是在64K色的图形模式下这种方法肯定是不行的
那用什么方法能获取呢?
256 还是 16色图形模式下的某点颜色值用getpixel获取就行
可是在64K色的图形模式下这种方法肯定是不行的
那用什么方法能获取呢?
最近才有时间弄这个~~
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
那就是说其实颜色种类并不是64K种拉!
多谢多谢!
但是这个问题也体现我的学习态度还是不好!
这个问题自己仔细算一下应该明白!
#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();
}
改进了一下
我改了改变量类型 然后显示后重显测试成功了
至于你那个方法我还要多研究一段日子(发现技术上有点限制)
我现在先用这个:
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));
}
所以非常感谢斑竹的帮助
一定一定
绝对不副众望
终于研究出来了
最近心情不是很好 事还多 所以一直没多弄 拖多了今天
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;
}