SDL基础使用04(SDL_image与SDL_mixer扩展库)

简介: 本文介绍了如何使用SDL_image和SDL_mixer扩展库在SDL项目中加载和显示图片以及播放音频文件。

SDL_image扩展库使用(显示jpg图片)

基本流程

  • 1.初始化SDL 、IMG SDL_Init IMG_Init
  • 2.创建窗口 SDL_CreateWindow
  • 3.基于窗口创建渲染器 SDL_CreateRenderer
  • 4.加载图片到surface IMG_Load
  • 5.根据图片surface创建纹理 SDL_CreateTextureFromSurface
  • 6.绘制三部曲

        清空渲染器                          SDL\_RenderClear  
        拷贝纹理数据到渲染器        SDL\_RenderCopy  
        刷新渲染器显示                   SDL\_RenderPresent
    
  • 7.退出SDL、IMG SDL_Quit IMG_Quit

#include <iostream>
/* SDL_image 扩展库使用 */
extern "C"
{
#include <SDL.h>
#include <SDL_image.h>
}

#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "x86/SDL2_image.lib")


#undef main
int main()
{
    // 1. 初始化
    int nRet = SDL_Init(SDL_INIT_EVERYTHING);
    if (nRet < 0)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    nRet = IMG_Init(IMG_INIT_JPG | IMG_INIT_PNG);
    if (nRet < 0)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 2.  创建窗口
    SDL_Window* pWnd = SDL_CreateWindow("Title",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        SDL_WINDOW_SHOWN);
    if (NULL == pWnd)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 3. 创建渲染器
    SDL_Renderer* pRender = SDL_CreateRenderer(pWnd, -1, SDL_RENDERER_ACCELERATED);
    if (NULL == pRender)
    {
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 4. 加载图片
    SDL_Surface* pSurface = IMG_Load("./longong.jpg");
    if (NULL == pSurface)
    {
        SDL_DestroyRenderer(pRender);
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 5. 根据表面创建纹理
    SDL_Texture* pTexture = SDL_CreateTextureFromSurface(pRender, pSurface);
    if (NULL == pTexture)
    {
        SDL_FreeSurface(pSurface);
        SDL_DestroyRenderer(pRender);
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 6. 绘制三部曲
    SDL_RenderClear(pRender);            // 清空一下(防止有残留的数据)
    SDL_RenderCopy(pRender, pTexture, NULL, NULL);        // 拷贝纹理数据到渲染器
    SDL_RenderPresent(pRender);                            // 刷新渲染器显示

    SDL_Delay(2000);

    // 7. 释放资源
    if (pSurface)
    {
        SDL_FreeSurface(pSurface);
    }
    if (pTexture)
    {
        SDL_DestroyTexture(pTexture);
    }
    if (pRender)
    {
        SDL_DestroyRenderer(pRender);
    }
    if (pWnd)
    {
        SDL_DestroyWindow(pWnd);
    }
    IMG_Quit();
    SDL_Quit();

    return 0;
}

注意坑

  1. 放置dll文件时还需要其它的dll文件 zlib1.dll(解压算法库) SDL2_ttf.dll SDL2_image.dll libpng16-16.dll zlib1.dll等
  2. 没有zlib1.dll会导致图像显示不出来

SDL_mixer扩展库使用(播放wav音频文件)

基本流程

  • 1.初始化 SDL_Init
  • 2.打开音频 Mix_OpenAudio
  • 3.加载音频文件 Mix_LoadWAV
  • 4.创建窗口 SDL_CreateWindow
  • 5.根据窗口获取surface SDL_GetWindowSurface
  • 6.播放音频文件 Mix_PlayChannel
  • 7.循环将数据喂给声卡播放 Mix_Playing
  • 8.释放资源退出 Mix_FreeChunk Mix_CloseAudio SDL_DestroyWindow SDL_Quit
#include <iostream>
/* 使用 SDL_mixer 播放wav格式音频(内部音频为pcm)文件 */
extern "C"
{
#include <SDL.h>
#include <SDL_mixer.h>
}

#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "x86/SDL2_mixer.lib")


#undef main
int main()
{    
    int channel = -1;

    // 1. 初始化
    int nRet = SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO);
    if (nRet < 0)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    int audio_rate = 22050;                    // 音视频播放频率
    int audio_format = AUDIO_S16SYS;        // 播放格式
    int audio_channels = 2;                    // 通道数
    int audio_chunkSize = 4096;                // 每次读取数据的大小

    // 2. 打开音频
    nRet = Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_chunkSize);

    // 3. 加载音频文件
    Mix_Chunk* sound = Mix_LoadWAV("./sound.wav");        // 存储音频文件在内存中
    if (NULL == sound)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    SDL_Window* pWnd = SDL_CreateWindow("Title",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        640, 480,
        SDL_WINDOW_SHOWN);
    if (NULL == pWnd)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    SDL_Surface* pSurface = SDL_GetWindowSurface(pWnd);
    if (NULL == pSurface)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 4. 播放音频文件
    channel = Mix_PlayChannel(-1, sound, 0);        // 返回声道数
    if (-1 == channel)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    while (Mix_Playing(channel) != 0);                // 将音频数据喂给声卡播放

    // 5. 释放资源
    Mix_FreeChunk(sound);
    Mix_CloseAudio();

    if (pWnd)
    {
        SDL_DestroyWindow(pWnd);
    }

    SDL_Quit();

    return 0;
}
相关文章
|
27天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
438 17
|
7天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
20天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
7天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
379 2
|
22天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
24天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2600 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
286 2
|
4天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
106 65
|
24天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1582 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码