嵌入式 Color Keying(抠色)SDL背景透明

2024-01-05 12:48

本文主要是介绍嵌入式 Color Keying(抠色)SDL背景透明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

照翻教程)现在你即将要学习如何使用color key,用English来说就是这个教程将要教你如何在使用一个表面的时候将其背景色去掉。SDL_Surface结构有一个叫做color key的结构,也就是代表了你在bliting表面的时候不想予以显示的颜色,当你想使用透明表面的时候这个是灰常有用滴!

如图,小人的背景是青色的(R:0,G:FF,B:FF),那么我们现在要将小人背景透明化,则现在的color key就是青色的。

SDL学习(四) <wbr>Color <wbr>Keying(抠色)

SDL学习(四) <wbr>Color <wbr>Keying(抠色)

color key 通常设置在图片装载的时候。

#include"SDL.h"
#include
//窗口层显示宽高和像素位设置
const int SCREEN_WIDTH=640;
const int SCREEN_HEIGHT=480;
const int SCREEN_BPP=32;

//表面指针
SDL_Surface *foo=NULL;
SDL_Surface *screen=NULL;
SDL_Surface *background=NULL;

//装载图像的函数
SDL_Surface *load_image(std::string filename)
{

//旧图像的暂存指针
SDL_Surface *loadImage=NULL;
//最优化以后的图像指针
SDL_Surface *optimizedImage=NULL;
loadImage=IMG_Load(filename.c_str());
if(loadImage!=NULL)
{//判断是否已经装载成功,如果成功就将旧版本图像做优化使其像素位适应当前的创库显示
//创建最优化图像
optimizedImage=SDL_DisplayFormat(loadImage);
//注意要记得释放旧版本的图像
SDL_FreeSurface(loadImage);
if(optimizedImage!=NULL)
{//指定colorkey
Uint32 colorkey=SDL_MapRGB(optimizedImage->format,0,0xFF,0xFF);
//SDL_MapRGB可以将我们给定的rgb映射成传入surface的像素格式
//设置青色透明
SDL_SetColorKey(optimizedImage,SDL_SRCCOLORKEY,colorkey);//SDL_SRCCOLORKEY标志保证我们在blit表面的时候是设置透明的

}
return optimizedImage;
}

}

//实现将源表面与目标表面做链接的函数
void apply_surface(int x,int y,SDL_Surface *source,SDL_Surface *destination)
{//x和y决定了源表面在目标表面的相对位置
//建立一个矩形来存储偏移量,SDL_Rect是一个能代表一个矩形区域的数据类型,它有x,y的offset参数,还有其自身width和height
SDL_Rect offset;
//给矩形的偏移赋值,如此做的原因是SDL_BlitSurface函数仅仅接受通过SDL_Rect传过来的偏移量
offset.x=x;
offset.y=y;
//链接源和目标表面
SDL_BlitSurface(source,NULL,destination,&offset);
}

int main(int argc,char *argv[])
{
if(SDL_Init(SDL_INIT_EVERYTHING==-1))
{//当初始化失败的时候,SDL会返回-1,此时我们就要通过返回1的错误句柄来终止程序
return 1;
}
//创建屏幕
screen=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);
if(screen==NULL)
{
return 1;
}
//设置窗口标题
SDL_WM_SetCaption("ColorKey",NULL);
foo=load_image("D:/Users/lucy/Documents/Visual Studio 2008/Projects/SDLtest/foo.png");
if(foo==NULL)
{
return 1;
}
background=load_image("D:/Users/lucy/Documents/Visual Studio 2008/Projects/SDLtest/background.png");
if(background==NULL)
{
return 1;
}
//在屏幕上应用背景,因为图片不够大所以只能够填满屏幕的一部分所以要四次调用链接函数将整个屏幕填满
apply_surface(0,0,background,screen);
apply_surface(240,190,foo,screen);
if(SDL_Flip(screen)==-1)
{
return 1;
}
SDL_Delay(1000);
SDL_FreeSurface(foo);
SDL_FreeSurface(background);
SDL_Quit();
return 0;
}

后记:

使用上面的代码的时候不知道为什么总是不能正常的装载图片,于是看了一下各个函数的介绍和surface的formate结构如下

1.int SDL_SetColorKey(SDL_Surface *surface,Uint32 flag,Unit32 key) 【抠色函数】

里面key就是要抠掉的颜色

2.Uint32 SDL_MapRGB(SDL_PixelFormat *fmt,Unit8 r,Uint 8 ,Uint8 b)【RGB映射函数】

fmt是一个颜色格式,通常会使用作为被抠色的矩形图片的颜色格式,下面是一个SLD_Surface结构

typedef struct SDL_Surface {

Uint32 flags;

SDL_PixelFormat *format;

int w,h;

Uint16 pitch;

void *pixels;

SDL_Rect clip_rect;

int refcount;

}

3.void DisplaySurface::colorKey(Uint8 r,Uint g,Uint32 b,Uint32 flag)

设置抠色模式函数,flag是位标,一般有三种模式,SDl_SRCCOLORKEY,表示正常抠色,

SDL_SRCCOLORKEY|SDL_RLEACCEL 表示将抠色以后的图片重新编码,(通常意味着重复使用的时候会快一些)

作为背景的颜色,一般选择’无红满绿满蓝'或者‘满红无绿满蓝’

这篇关于嵌入式 Color Keying(抠色)SDL背景透明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572920

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

三色标记(Tri-color marking)

维基百科部分 原文 https://en.wikipedia.org/wiki/Tracing_garbage_collection#TRI-COLOR Because of these performance problems, most modern tracing garbage collectors implement some variant of the tri-color ma

深入探索嵌入式 Linux

摘要:本文深入探究嵌入式 Linux。首先回顾其发展历程,从早期尝试到克服诸多困难逐渐成熟。接着阐述其体系结构,涵盖硬件、内核、文件系统和应用层。开发环境方面包括交叉编译工具链、调试工具和集成开发环境。在应用领域,广泛应用于消费电子、工业控制、汽车电子和智能家居等领域。关键技术有内核裁剪与优化、设备驱动程序开发、实时性增强和电源管理等。最后展望其未来发展趋势,如与物联网融合、人工智能应用、安全性与

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

数据中台出现的背景

数据中台产生背景 数据建设中出现的问题 在企业数据建设过程中,都离不开大数据平台建设,大数据平台建设涉及数据采集、数据存储、数据仓库构建、数据处理分析、数据挖掘、数据可视化等一系列流程。 随着企业体量不断增大,一个企业可能有总公司及很多子公司,随着企业各类业务多元化和垂直业务发展,从全企业角度来看,每个子公司或者某些独立的业务部都在构建大数据分析平台,在企业内部形成了很多分散、烟囱式、独立的

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

嵌入式技术的核心技术有哪些?请详细列举并解释每项技术的主要功能和应用场景。

嵌入式技术的核心技术包括处理器技术、IC技术和设计/验证技术。 1. 处理器技术    通用处理器:这类处理器适用于不同类型的应用,其主要特征是存储程序和通用的数据路径,使其能够处理各种计算任务。例如,在智能家居中,通用处理器可以用于控制和管理家庭设备,如灯光、空调和安全系统。    单用途处理器:这些处理器执行特定程序,如JPEG编解码器,专门用于视频信息的压缩或解压。在数字相机中,单用途