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