zoukankan      html  css  js  c++  java
  • 【秒懂音视频开发】21_显示BMP图片

    文本的主要内容是:使用SDL显示一张BMP图片,算是为后面的《显示YUV图片》做准备。

    为什么是显示BMP图片?而不是显示JPG或PNG图片?

    • 因为SDL内置了加载BMP的API,使用起来会更加简单,便于初学者学习使用SDL
    • 如果想要轻松加载JPG、PNG等其他格式的图片,可以使用第三方库:SDL_image

    宏定义

    #include <SDL2/SDL.h>
    #include <QDebug>
    
    // 出错了就执行goto end
    #define END(judge, func) 
        if (judge) { 
            qDebug() << #func << "Error" << SDL_GetError(); 
            goto end; 
        }
    

    变量定义

    // 窗口
    SDL_Window *window = nullptr;
    // 渲染上下文
    SDL_Renderer *renderer = nullptr;
    // 像素数据
    SDL_Surface *surface = nullptr;
    // 纹理(直接跟特定驱动程序相关的像素数据)
    SDL_Texture *texture = nullptr;
    

    初始化子系统

    // 初始化Video子系统
    END(SDL_Init(SDL_INIT_VIDEO), SDL_Init);
    

    加载BMP

    // 加载BMP
    surface = SDL_LoadBMP("F:/in.bmp");
    END(!surface, SDL_LoadBMP);
    

    创建窗口

    // 创建窗口
    window = SDL_CreateWindow(
                 // 窗口标题
                 "SDL显示BMP图片",
                 // 窗口X(未定义)
                 SDL_WINDOWPOS_UNDEFINED,
                 // 窗口Y(未定义)
                 SDL_WINDOWPOS_UNDEFINED,
                 // 窗口宽度(跟图片宽度一样)
                 surface->w,
                 // 窗口高度(跟图片高度一样)
                 surface->h,
                 // 显示窗口
                 SDL_WINDOW_SHOWN
             );
    END(!window, SDL_CreateWindow);
    

    创建渲染上下文

    // 创建渲染上下文(默认的渲染目标是window)
    renderer = SDL_CreateRenderer(window, -1,
                                  SDL_RENDERER_ACCELERATED |
                                  SDL_RENDERER_PRESENTVSYNC);
    if (!renderer) { // 说明开启硬件加速失败
        renderer = SDL_CreateRenderer(window, -1, 0);
    }
    END(!renderer, SDL_CreateRenderer);
    

    创建纹理

    // 创建纹理
    texture = SDL_CreateTextureFromSurface(
                  renderer,
                  surface);
    END(!texture, SDL_CreateTextureFromSurface);
    

    渲染

    // 设置绘制颜色(这里随便设置了一个颜色:黄色)
    END(SDL_SetRenderDrawColor(renderer,
                                 255, 255, 0,
                                 SDL_ALPHA_OPAQUE),
          SDL_SetRenderDrawColor);
    
    // 用DrawColor清除渲染目标
    END(SDL_RenderClear(renderer),
          SDL_RenderClear);
    
    // 复制纹理到渲染目标上
    END(SDL_RenderCopy(renderer, texture, nullptr, nullptr),
          SDL_RenderCopy);
    
    // 将此前的所有需要渲染的内容更新到屏幕上
    SDL_RenderPresent(renderer);
    

    延迟退出

    // 延迟3秒退出
    SDL_Delay(3000);
    

    释放资源

    end:
        // 释放资源
        SDL_FreeSurface(surface);
        SDL_DestroyTexture(texture);
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);
        SDL_Quit();
    
  • 相关阅读:
    [C语言嵌入式系统编程修炼] 软件架构与内存操作篇
    [C陷阱和缺陷] 第2章 语法“陷阱”
    DAO是什么技术
    Java泛型:类型擦除
    Java泛型:泛型类、泛型接口和泛型方法
    定义泛型接口
    java,<E>什么意思?
    java List 去重(两种方式)
    java中List集合及其遍历详解
    java 遍历arrayList的四种方法
  • 原文地址:https://www.cnblogs.com/mjios/p/14733502.html
Copyright © 2011-2022 走看看