SDL基础使用03(渲染显示bmp图片)

简介: 如何使用SDL库在C++中创建窗口、加载BMP图片、创建纹理,并通过渲染器进行显示的完整过程。

基于渲染器 显示bmp图片

    1. 初始化SDL SDL_Init
    1. 创建窗口 SDL_CreateWindow
    1. 基于窗口创建渲染器 SDL_CreateRenderer
    1. 加载bmp图片到surface SDL_LoadBMP
    1. 根据图片surface创建纹理 SDL_CreateTextureFromSurface
    1. 绘制三部曲

    清空渲染器上一次显示 SDL_RenderClear
    拷贝纹理数据到渲染器 SDL_RenderCopy
    更新渲染器显示 SDL_RenderPresent

    1. 释放资源,退出 SDL_FreeSurface......
#include <iostream>
/* 纹理和渲染(渲染显示bmp图片) */
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.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;
    }

    // 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_ACCELERATED   GPU硬件加速渲染
    SDL_Renderer* pRenderer = SDL_CreateRenderer(pWnd, -1, SDL_RENDERER_ACCELERATED); 
    if (NULL == pRenderer)
    {
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 4. 加载bmp图片到surface
    SDL_Surface* pSurface = SDL_LoadBMP("./Panda.bmp");        // 加载bmp图片
    if (NULL == pSurface)
    {
        SDL_DestroyRenderer(pRenderer);
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    SDL_Rect rect = { 0, 0, pSurface->w - 50, pSurface->h + 50 };
    // 5. 根据Surface创建纹理
    SDL_Texture*  pTexture = SDL_CreateTextureFromSurface(pRenderer, pSurface);
    if (NULL == pTexture)
    {
        SDL_FreeSurface(pSurface);
        SDL_DestroyRenderer(pRenderer);
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

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

    SDL_Delay(2000);

    // 7. 释放资源,退出
    // 释放表面
    if (pSurface)
    {
        SDL_FreeSurface(pSurface);
    }
    // 释放纹理
    if (pTexture)
    {
        SDL_DestroyTexture(pTexture);
    }
    // 释放渲染
    if (pRenderer)
    {
        SDL_DestroyRenderer(pRenderer);
    }
    // 释放窗口
    if (pWnd)
    {
        SDL_DestroyWindow(pWnd);
    }
    SDL_Quit();

    return 0;
}
相关文章
|
5月前
|
机器学习/深度学习 存储 弹性计算
阿里云服务器价格表【2026最新】一年、1个月和1小时收费标准(透明公开)
2026年阿里云服务器最新价格表:轻量应用服务器低至38元/年,ECS年付99元起,GPU服务器月付1681元起;支持中国大陆及海外多地域部署,提供年付、月付、按小时计费三种模式,并可灵活选配带宽与系统盘。
|
10月前
|
机器学习/深度学习 存储 前端开发
阿里云服务器8核16G配置详解:热门实例规格、价格与选购指南
阿里云服务器8核16G配置,这样的配置能够满足大多数中小型网站、Web前端服务器以及计算密集型任务的需求。根据最新的收费标准及活动价格来看,云服务器8核16G配置收费标准最低的是经济型e实例,按量收费标准0.9元/小时,如果是需要年付的话,目前选择计算型c8y实例的活动价格为为2861.27元/1年起。本文为大家介绍8核16G配置的几款主要热门实例规格各自的性能与收费标准价格情况,以供选购参考。
|
11月前
|
数据采集 人工智能 算法
开源能源管理系统应用前景:以 MyEMS 为例
MyEMS 是一款基于 Python 和 React 的开源能源管理系统,助力企业实现能源数据采集、分析与优化,支持电、水、气、热及新能源的数据接入。其开源特性降低部署成本,结合 AI 分析与模块化设计,广泛应用于工业、建筑、园区等场景,提升能效、降低能耗成本,并推动碳中和目标的实现。
310 0
|
安全 物联网 编译器
Zig 教程
Zig 教程
1163 1
|
消息中间件 NoSQL 前端开发
知识付费卖课和在线教育系统源码
随着越来越多的教师和内容创作者希望通过专属平台售卖课程,搭建一套知识付费和在线教育系统成为行业热点。本文详细介绍了系统的架构设计、核心功能模块、技术实现、源码示例及开发建议,帮助开发者快速实现课程发布、学员学习、订单支付等功能。
1304 6
(7)Qt中的自定义槽(函数)
这篇文章介绍了在Qt中如何定义和使用自定义槽函数,包括类成员函数、静态类成员函数、全局函数和lambda表达式作为槽函数的示例,以及使用lambda表达式时的注意事项。
804 2
(7)Qt中的自定义槽(函数)
|
XML Java 数据格式
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
lua遍历table的方式、运算符、math库、字符串操作方法
1340 0
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
|
Linux Perl
kylinV10SP2切换启动内核
kylinV10SP2切换启动内核
|
XML 小程序 JavaScript
微信小程序如何使用地图
微信小程序如何使用地图
1295 4
|
存储
CMake中遍历元素的技巧:foreach命令详解
CMake中遍历元素的技巧:foreach命令详解
1126 1

热门文章

最新文章