色彩格式间的转换



一般情况下, Allegro 是为同时使用一种颜色深度设计的, 因此你只要调用一次 set_color_depth() 然后将你所有 位图以相同的格式储存. 如果你想混合使用几种不同的点格式, 就可以使用 create_bitmap_ex() 来代替 create_bitmap(), 通过调用 bitmap_color_depth() 来查询指定图片的格式. 所有的 图形例程需要它所有的参数在相同的格式下 (例如: 你不能拉伸 15 位的源图到一个 24 位 目标图上), 但是有三个例外: blit() 可以在任何 位图格式间复制, 根据需要转换数据, draw_sprite() 可以 将 256 色的源图画在任何格式的目标图上, 而且 draw_character() _总是_ 无论目标图是什么格式都使用 256 色的源图.


将 256 色源图展开到真彩目标图相当的快 (显然在做转换之前你必须设置正确调色板!). 在不同的真彩格式间转换有点点慢, 将真彩图片减少到 256 色就非常的慢了 (如果你在转换前设置了全局 rgb_map 表就可以提高许多的速度了).


int bestfit_color(PALLETE pal, int r, int g, int b);
搜索指定的调色板来寻找寻求颜色的最佳匹配, 是 VGA 硬件 0-63 格式. 正常情况你 应该用调用 makecol8() 替代, 但是如果你需要使用其他的调色板 而不是当前选择的一个, 或特殊情况下你不想使用 rgb_map 查找表, 这个底层函数就很有用了.

extern RGB_MAP *rgb_map;
为了提高将 RGB 值减到 8 位调色板的速度, Allegro 使用了一个 32k 查找表 (每部分颜色 5 位). 你必须在使用光影例程前 设置这个表, 如果提供了这张表, 将大量提升 makecol8() 函数的速度. RGB 表可以利用 rgbmap 工具预先算好, 或者运行时在得到. RGB_MAP 结构是这样定义的:

   typedef struct {
      unsigned char data[32][32][32];
   } RGB_MAP;

void create_rgb_table(RGB_MAP *table, PALETTE pal, void (*callback)(int pos));
用查找数据填充指定的 RGB 映射表来运用于指定的调色板. 如果回叫函数不为 NULL, 它将在计算过程中调用它 256 次, 这允许你显示一个进度指示器.


void hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b);
void rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v);
在 HSV 和 RGB 颜色之间转换色彩值. RGB 值的范围是 从 0 到 255, 色度的范围是从 0 到 360, 饱和度和亮度的范围是 0 到 1.




返回