1:什么是抠色(Color Keying)

我们总是blit矩形区域的图片,但是很显然,几乎没有一个游戏的角色图片是矩形的。美工把图片画到一个矩形范围内,如果设定了特定的背景颜色,我们就可以把矩形图片上的角色“抠”下来,相对于背景来说,我们就是把不属于角色的背景颜色扣掉,故称抠色。
        我们看看SDL抠色函数的原形:

int  SDL_SetColorKey(SDL_Surface  * surface, Uint32 flag, Uint32 key);

这里有个参数是Uint32 key,这就是我们要抠掉的颜色。要明白SDL如何描述颜色的,我们先看看另外一个函数。

2:RGB映射

Uint32 SDL_MapRGB(SDL_PixelFormat  * fmt, Uint8 r, Uint8 g, Uint8 b);

显然,参数r, g, b代表了红,绿和蓝。而fmt则是代表了这些颜色的格式。我们一般会选择使用作为被抠色的矩形图片的颜色格式。这样的图片是一个SDL_Surface结构。

typedef  struct  SDL_Surface {
  Uint32 flags;                            /*  Read-only  */
  SDL_PixelFormat  * format;                 /*  Read-only  */
   int  w, h;                                /*  Read-only  */
  Uint16 pitch;                            /*  Read-only  */
   void   * pixels;                            /*  Read-write  */
  SDL_Rect clip_rect;                      /*  Read-only  */
   int  refcount;                            /*  Read-mostly  */

/*  This structure also contains private fields not shown here  */

} SDL_Surface;

也就是成员数据format,所以,我们很自然的可以把RGB映射看成是SDL Surface的一个方法。同样,因为抠色行为也绑定在相应的Surface上,所以我们可以想到把这两个函数合起来,作为我们所构建的SDL Surface的一个类方法。
        请注意成员数据w和h,在之前的程序中,我们直接定义了frontImage的大小为常量。我们可以把程序修改得更加健壮一些——让程序自动反馈frontImage的大小。

     // moving image's size.
     const   int  IMG_WIDTH  =  frontImage.point() -> w;
     const   int  IMG_HEIGHT  =  frontImage.point() -> h;

3:添加Surface的类方法,抠色

class  DisplaySurface
{
private :
     //
public :
     //
         void  colorKey(Uint8 r, Uint8 g, Uint8 b, Uint32 flag  =  SDL_SRCCOLORKEY);
};

其它的成员数据和成员函数不需要做任何的改变。我们只需要增加一个新的类方法colorKey()。
        需要说明的是flag位标,它有三种模式:
SDL_SRCCOLORKEY 表示正常抠色;
0 表示清除扣色效果;
SDL_SRCCOLORKEY|SDL_RLEACCEL 表示将扣色后的图片重新编码(通常意味着重复使用时会快些)。
    作为背景的颜色,一般选择“无红满绿满蓝”(r=0,g=0xFF,b=0xFF)或者“满红无绿满蓝”(r=0xFF,g=0,b=oxFF)。要直观的了解这两种颜色,最好的方法是直接打开画图程序,用调色版将这两种颜色配出来。(我们这里的例子中使用了“无红满绿满蓝”的背景。)类方法的实现如下:

void  DisplaySurface::colorKey(Uint8 r, Uint8 g, Uint8 b, Uint32 flag)
{
    Uint32 colorkey  =  SDL_MapRGB(pSurface -> format, r, g, b);
     if  ( SDL_SetColorKey(pSurface, flag, colorkey )  <   0  )
         throw  ErrorInfo(SDL_GetError());
}

SDL的风格,如果SDL_SetColorkey()成功则返回0,否则返回-1。

4:在主程序中使用新的类方法,抠色

因为是类方法,所以使用起来就很直观了。我们在创建需要抠色的DisplaySurface对象之后,直接使用类方法就可以了。比如一个使用 “无红满绿满蓝”背景的需要抠色的图片colorkey.bmp,我们使用如下语句就可以轻松实现抠色了。

DisplaySurface frontImage("colorkey.bmp", screen);
    frontImage.colorKey(0, 0xFF, 0xFF);

http://www.cppblog.com/lf426/archive/2008/03/19/44884.html

SDL入门教程(七):SDL抠色(Color Keying)相关推荐

  1. SDL入门教程(一):2、Visual C++ 下的安装与设置

    作者:龙飞 2.1:获得Visual C++ 2008 Express Edition. 使用盗版不是一个好习惯.与其背上贼名,我更愿意放弃华丽的外表,使用朴实无华的免费软件.你可能知道Linux和G ...

  2. 图像设定阈值二值matlab,“图像类型转换II——使用“导入、导出和转换”中的“阈值法”转换为二值图像”,MATLABImageProcessingToolbox,入门教程,七,之...

    1 imbinarize函数 在 [MATLAB Image Processing Toolbox 入门教程二]快速入门之"亮度校正"和"目标识别" 中我们已经 ...

  3. SDL入门教程(十):2、直接通过Unicode让SDL显示中文

    作者:龙飞 2.1:SDL本身可以显示中文吗? SDL的扩展库SDL_ttf本身具备显示中文的功能吗?网上很多观点,说不能显示的,甚至做了分析解释了原因.但是,事实是,SDL本身就可以显示中文.如果我 ...

  4. SDL入门教程(八):1、裁剪精灵图片(Clip Blitting and Sprite Sheets)

    作者:龙飞 这两天下雨,所以就暂停了寻春的步伐,多写了点教程. 绵阳的春天是美丽的,大家学习和写程序之余,还是应该多看看大自然.给大家推荐我拍的风景照啦,呵呵. http://picasaweb.go ...

  5. 【大白话学习】UniApp 微信小程序与APP应用 开发零基础入门教程(七)---登陆注销功能与微信小程序测试号的申请

    到此为止,我们只差一个退出登陆功能了. 回到index.vue页面,之前我们已经预留了退出按钮,现在给它加上功能 <button class="mybutton" type= ...

  6. 图深度学习,入门教程七,残差多层图注意力模型

    深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习.还会定期更新哦. 主要是基于图深度学习的入门内容.讲述最基本的基础知识,其中包括深度学习.数学.图神 ...

  7. 前端入门教程(七)CSS属性设置

    宽和高 width属性可以为元素设置宽度. height属性可以为元素设置高度. 块级标签才能设置宽度,内联标签的宽度由内容来决定. 字体属性 文字字体 font-family可以把多个字体名称作为一 ...

  8. linux入门教程(七) linux系统用户以及用户组管理

    关于这部分内容,笔者在日常的linux系统管理工作中用到的并不多,但这并不代表该内容不重要.毕竟linux系统是一个多用户的系统,每个账号都干什么用,你必须了如指掌.因为这涉及到一个安全的问题. [认 ...

  9. 【Protocol Buffer】Protocol Buffer入门教程(七):导入定义

    00. 目录 文章目录 00. 目录 01. 消息格式 02. 参考程序 03. 编译测试 04. 附录 01. 消息格式 info.proto文件内容如下: syntax = "proto ...

最新文章

  1. 常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别
  2. gRPC中Java和node进行异构通信-互为客户端和服务端
  3. 冒泡排序python实现
  4. 别总写代码,这100多个相见恨晚的网站比涨工资都重要
  5. 在 net send 命令中实现换行(信使服务)
  6. Windows UI风格的设计(9)
  7. 日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···
  8. 换个角度看GAN:另一种损失函数
  9. 不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
  10. 让开发人员变平庸的八个习惯,看看你中了几条
  11. Android入门篇二:使用意图在Activity之间传递数据
  12. ROS2的学习笔记(legacy)
  13. ajax调用webService
  14. TCP SYN-Cookie背后的人和事
  15. 语音合成TTS主要模型分析
  16. intellij IDEA更换主题为Darcula后中文项目名称变口(方框)的解决办法
  17. 深度学习经典试题29道
  18. 浔阳江头夜送客,枫叶荻花秋瑟瑟——python标准输入、标准输出和注释
  19. 汇编语言实现七段数码管显示控制实验
  20. tomcat如何编译java_tomcat怎么编译java

热门文章

  1. Unity-Graphic绘制菱形Rhombus
  2. the spell of the rising moon
  3. Failed to initialize Data Warehouse host process
  4. hashmap扩容线程安全问题_HashMap是非线程安全,为什么ConcurrentHashMap能做到线程安全?...
  5. 【PowerDesigner】Mysql设计工具 16.5破解
  6. 翻转课堂十大精彩案例
  7. 2021校招面经(网络方向)
  8. less-用法:简介、变量、混合、嵌套、运算、转义、函数、映射、作用域、注释、导入、继承、条件判断
  9. box2d的角色邹形
  10. VPS与云主机指南:了解五个主要区别