微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Allegro 5 中仅着色一种颜色的位图

如何解决在 Allegro 5 中仅着色一种颜色的位图

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

  1. 按照帖子中的图片制作一条白蛇。
  2. 将白色变成另一种颜色。

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

  • al_tinted_bitmap - 它还为眼睛和舌头着色
  • al_get_pixel、put_pixel - 但我必须给 x/y 白色,这对于像这样的位图来说真的很难(我的意思是......用正方形会更容易)

所以我想,我需要一个函数或类似“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,color);
}

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

color = al_get_pixel(snake_white,y);
if(color.r >= 0.01 && color.g >= 0.01 && color.b >= 0.01) {
    al_put_pixel(x,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,color);
}

您可以通过多种方式使其更智能,但它对蛇图像效果很好。有关完整代码,请参阅链接的论坛主题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。