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;
}
相关文章
|
Linux C语言 C++
现代c++中实现精确延时方法总结
现代c++中实现精确延时方法总结
ly~
|
Ubuntu Linux C语言
SDL 图形库安装常见错误及解决方法
SDL(Simple DirectMedia Layer)图形库安装过程中可能会遇到编译错误、运行时错误、依赖库缺失等问题。本文总结了在 Linux 和 Windows 系统上常见的错误及解决方法,包括检查和安装依赖库、配置 SDL 子系统、处理 X11 错误等,帮助用户顺利完成 SDL 的安装和配置。
ly~
3580 8
|
Ubuntu 开发工具 git
Ubuntu编译ffmpeg解决错误:ERROR: avisynth/avisynth_c.h not found
通过本文的详细指导,您可以顺利地在Ubuntu系统上配置和编译FFmpeg,并解决Avisynth头文件缺失的问题。
745 27
|
存储 数据采集 数据处理
【数据结构进阶】位图
位图是一种高效的数据结构,通过二进制的0和1表示数据的存在状态,适用于海量数据的压缩存储与快速检索。本文从概念、实现到应用场景全面解析位图。核心思想是将数据映射到位图的比特位,利用位运算实现O(1)时间复杂度的增删查操作。文章通过C++代码示例展示了位图的三大接口(set、unset、test)实现,并对比自定义位图与标准库`bitset`的异同。位图优点在于极高的时间和空间效率,但仅适用于整型数据。它为布隆过滤器等高级结构奠定了基础,在数据处理领域具有重要价值。
1034 1
ly~
|
缓存 监控 编译器
如何优化 SDL 图形库在不同系统中的性能
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发库,用于优化不同系统中的图形库性能。在银河麒麟系统中,通过SDL渲染模式提升视频监控客户端性能,支持更多播放路数。优化方法包括:1) 图像加载时使用SDL_ConvertSurface转换图像格式,避免内存中存在多份拷贝;2) 在VSCode下配置SDL时,合理设置编译器选项和项目架构,减少API调用带来的性能开销;3) 使用SDL库在景嘉微7200显卡上优化渲染性能,提高播放路数。综合考虑图像加载优化、系统特性利用及硬件兼容性,以实现最佳性能。
ly~
1134 6
|
编解码 网络协议 编译器
SDL库入门:掌握跨平台游戏开发和多媒体编程(二)
SDL库入门:掌握跨平台游戏开发和多媒体编程
1043 0
ly~
|
并行计算 算法 API
SDL 图形库优化对硬件要求有何变化
SDL(Simple DirectMedia Layer)图形库是一个跨平台的多媒体库,适用于多种操作系统和设备。优化后的SDL 2.0对硬件的要求有所提升,特别是显卡性能。优化包括提高渲染效率、利用硬件加速功能、支持高效解码算法等,以增强图形处理能力和流畅度。同时,优化后的SDL对输入设备的交互体验要求更高,需确保键盘、鼠标、触摸屏等设备的顺畅操作。尽管如此,SDL仍保持良好的兼容性,能在较低配置的硬件上运行,只是性能表现会有所差异。
ly~
1184 4
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy&lt;T&gt;` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
795 1
|
Java Maven Spring
如何在idea中创建Springboot项目? 手把手带你创建Springboot项目,稳!
文章详细介绍了在IDEA中创建Spring Boot项目的过程,包括选择Spring Initializr、配置项目属性、选择Spring Boot版本、导入依赖、等待依赖下载以及项目结构简介。
23672 1
|
Windows
SDL基础使用07(YUV数据显示)
使用SDL库在Windows上处理和显示YUV数据,包括生成随机YUV数据、播放YUV文件以及实现带缩放的实时渲染。
355 1