在 Allegro 5 中只为位图着色一种颜色

Coloring only one color of bitmap in Allegro 5

我正在使用 Allegro 5 库用 C 语言制作一个项目。我为我的蛇买了一些皮,但我想做一些更好的东西,比如用户风格的皮。我认为最好的方法是:

  1. 像post中的图片那样制作一条白蛇。
  2. 将白色变为另一种颜色。

现在我正在寻找 Allegro 功能以使其变得快速和简单。 我得到了什么:

所以我认为,我需要一个函数或类似“get_pixel”的函数,但要指定 rgb(R, G, B),而不是 X/Y。 我应该尝试使用什么来让它发挥那样的功能?

bitmap of snake

这个问题引出了一个很好的问题 discussion on the allegro forums 感谢 Dizzy Egg 详细地解决了这个例子。我把答案总结在这里供以后参考。

使用 al_tinted_bitmap 的解决方案绝对可行,但我会选择 get_pixel / put_pixel 方法,因为您有更多的控制权。用另一种颜色的像素替换一种颜色的像素并不难。只需遍历位图中的每个像素并执行此操作:

color = al_get_pixel(snake_white, x, y);
if(color.r == 1.0 && color.g == 1.0 && color.b == 1.0) {
    al_put_pixel(x, y, al_map_rgb(50, 255, 50)); //Choose your own colour!
}
else {
    al_put_pixel(x, y, color);
}

这种情况下的问题是,由于蛇轮廓上的抗锯齿,您不仅有一种颜色(白色),还有灰色阴影。所以我们可以做的是检查每个像素的 r、g 和 b 分量是否都非零。如果它们都非零,那么它既不是黑色,也不是红色(舌头)或黄色(眼睛)。然后我们将灰度值与我们自己选择的 r、g、b 分量相乘。

color = al_get_pixel(snake_white, x, y);
if(color.r >= 0.01 && color.g >= 0.01 && color.b >= 0.01) {
    al_put_pixel(x, y, al_map_rgba_f(new_color.r * color.r, new_color.g * color.g, new_color.b * color.b, color.a));
}
else {
    al_put_pixel(x, y, color);
}

你可以在很多方面让它变得更聪明,但它对蛇图像很有效。有关完整代码,请参阅链接的论坛主题。