【音视频连载-004】基础学习篇-SDL 加载图片并显示

简介: 在前面的文章中已经介绍完 SDL 显示窗口、消息循环和事件响应这些基础内容,有了这些基础就可以进行功能性开发了。本篇的主要内容是利用 SDL 加载并显示一张图片,然后再去进行更多的音视频操作。

作者:星陨

SDL2_Image 配置

之前写过两篇 libpng 和 libjpeg-turbo 编译与实践的文章:

图像库 libpng 编译与实践
图像库 libjpeg-turbo 编译与实践

有需要的可以去翻阅一下。

在 SDL 中加载 png 或者 jpeg 图片用不到上面两个库了,需要用到 SDL 特定的图片库 SDL_Image ,执行以下命令去下载:

brew install sdl2_image

我用的版本是 2.0.5 ,也是目前最新的版本,之后我们要在 CMake 中去配置它。

CMake 工程配置

av-beginner 项目的 CMake 配置做了一些改动,创建了一个 cmake_utils 的目录,在该目录下创建了一个 CMakeLists.txt ,里面存放一些自定义的函数,专门用来做开源库的链接加载工作,如下图红框内容所示:
image.png

定义了一个 init_path 的宏,宏的功能和函数是有些类似的,在里面定义了不同开源库的路径变量,后续只要引用这些变量就好了。如果你的电脑上路径不同,修改这里的宏定义就行。

如果对 CMake 的操作不熟悉的话,建议阅读之前写过的文章,涵盖了很多基础操作。 Android NDK 开发之 CMake 必知必会

当下载了 SDL_Image 之后,找到它的路径,把它的库加载到 CMake 链接目录中来,也就是要调 link_directories 方法,这里同样可以定义一个宏:

macro(link_sdl_image)
    message("link sdl image library and path is ${sdl_image_dir}")
    include_directories(${sdl_image_dir}/include/SDL2)
    link_directories(${sdl_image_dir}/lib)
endmacro()

之后就需要把目标执行文件或者目标库与 SDL_Image 开源库关联起来,也就是 target_link_libraries 方法,同样定义一个宏:

macro(target_link_sdl_image name)
    message("${name} link sdl image")
    target_link_libraries(${name}
            SDL2_image
            )
endmacro()

这个宏有个参数 name ,它就是要链接的目标文件 target 。

对于 SDL 库或者其他库,也可以创建类似的宏,具体在源码中能看到。

在完成了 SDL_Image 的 CMake 配置之后,就需要在工程的主 CMakeLists.txt 文件中把它包含进去,现在还只是在 cmake_utils 目录中,这样是引用不到宏的。

通过 add_subdirectory 方法将定义的功能添加进来,接下来就可以使用了。

image.png

同时,对于 SDL 项目代码,单独创建一个文件夹去存放,再根据每个小项又划分文件夹:

image.png

如上图所示,针对每个小项又有单独的 CMakeLists.txt 配置文件,在里面按需执行动态库的关联就好了。

经过以上的工程配置整改,对于后续的开发模块划分是很有帮助的,不仅便于添加各种开源库,更利于去单个编译项目。

后续添加的库都会按照这个模式进行添加。

SDL_Image 加载 图片并显示

完成了配置之后,就可以进行 SDL_Image 的开发了,整个开发流程比较简单。

前面的文章中我们创建并展示了 SDL_Window,SDL_Window 内有一个叫做 SDL_Surface 的结构,实际上它才是最终渲染展示的。

我们加载一张图片,并将图片转换成 SDL_Surface ,然后把图片对应的 SDL_Surface 转换到 SDL_Window 对应的 SDL_Surface ,再更新一下 SDL_Window 的 SDL_Surface 内容,渲染到屏幕就好了。

核心代码如下所示:

// 得到 SDL_Window 的 SDL_Surface
    SDL_Surface *pWindowSurface = SDL_GetWindowSurface(pWindow);
    // 根据图片创建一个 SDL_Surface
    SDL_Surface *pImageSurface = IMG_Load(image_path.c_str());
    bool bQuit = false;
    SDL_Event windowEvent;
    while (!bQuit){
        while (SDL_PollEvent(&windowEvent)){
            switch (windowEvent.type){
                case SDL_QUIT:
                    bQuit = true;
                    break;
                default:
                    break;
            }
        }
        // 将 pImageSurface 的内容传输到 上
        SDL_BlitSurface(pImageSurface, nullptr,pWindowSurface,nullptr);
        // 上屏操作,将 Surface 内容显示到屏幕上
        SDL_UpdateWindowSurface(pWindow);
    }

最终结果如下:

image.png

总结

以上就是音视频基础学习连载的 004 篇。

完成了 SDL 加载图片并显示的流程,整体代码比较简单,很多东西都是之前文章提到过的,反而重点更侧重于工程的 CMake 配置,有兴趣的可以看看代码。

具体代码见仓库:

https://github.com/glumes/av-beginner

本篇文章对应的提交 tagav-beginner-004,可切换至对应源码查看。

能力有限,文中有不对之处,欢迎加我微信 ezglumes 进行交流~~

SDL 系列文章

「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

阿里云社区.png

相关文章
|
7月前
|
缓存 Linux
Linux 麒麟系统安装 libstdc++ rpm 包步骤
下载指定rpm文件后,通过终端进入目录,使用`sudo yum install`命令安装libstdc++库,自动解决依赖。安装后通过`rpm -q`或`ldconfig -p`验证是否成功。如遇问题可卸载旧版或更新缓存。
GitHub:如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细攻略(图文教程)
GitHub:如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细攻略(图文教程)
GitHub:如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细攻略(图文教程)
|
C++ 索引 容器
【C++STL入门】vector查、改、交换
【C++STL入门】vector查、改、交换
1317 1
SDL基础使用04(SDL_image与SDL_mixer扩展库)
本文介绍了如何使用SDL_image和SDL_mixer扩展库在SDL项目中加载和显示图片以及播放音频文件。
903 1
|
数据采集 人工智能 自然语言处理
《深度融合:DeepSeek无缝嵌入现有业务系统全攻略》
在数字化转型中,企业利用人工智能提升效率和创新能力。DeepSeek作为强大的大语言模型,以其出色的推理能力为企业带来新机遇。集成DeepSeek需经过系统评估、需求分析和技术选型,选择API调用或私有化部署。通过接口对接、数据预处理和模型优化,逐步实现深度融合。最后,进行全面测试确保集成效果,为企业业务创新注入强大动力。
1360 0
ly~
|
缓存 监控 编译器
如何优化 SDL 图形库在不同系统中的性能
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发库,用于优化不同系统中的图形库性能。在银河麒麟系统中,通过SDL渲染模式提升视频监控客户端性能,支持更多播放路数。优化方法包括:1) 图像加载时使用SDL_ConvertSurface转换图像格式,避免内存中存在多份拷贝;2) 在VSCode下配置SDL时,合理设置编译器选项和项目架构,减少API调用带来的性能开销;3) 使用SDL库在景嘉微7200显卡上优化渲染性能,提高播放路数。综合考虑图像加载优化、系统特性利用及硬件兼容性,以实现最佳性能。
ly~
1093 6
|
Linux API 开发者
SDL库入门:掌握跨平台游戏开发和多媒体编程(一)
SDL库入门:掌握跨平台游戏开发和多媒体编程
2322 1
|
API
图片转ASCII图片(像素图,艺术图)免费API接口教程
此API可将指定图片转换为ASCII风格或像素风格图片。支持POST/GET请求,需提供用户ID、KEY及图片等参数,可选设置背景色、文本色、图片宽度、灰度及风格。返回状态码、提示信息及图片地址。示例及详情见官网。
594 0
|
存储 数据可视化 数据挖掘
Python 3 中使用 pandas 和 Jupyter Notebook 进行数据分析和可视化
Python 3 中使用 pandas 和 Jupyter Notebook 进行数据分析和可视化
566 0