【音视频之SDL2】bmp图片与绘制bmp

文章目录


前言

在现代多媒体应用中,图像的处理和显示是非常重要的一部分。无论是在游戏开发还是在视频处理软件中,图像显示都是不可或缺的功能。本文将介绍如何使用SDL2库来绘制BMP图像,包括BMP的基本概念、SDL2绘制BMP的原理和具体的绘制流程。


BMP是什么

BMP(Bitmap)是一种图像文件格式,通常用于存储数字图像。它由微软公司开发,并在Windows操作系统中广泛使用。BMP格式具有简单的结构,包括文件头、信息头、调色板(可选)和图像数据。BMP图像支持多种色深,包括1位、4位、8位、16位、24位和32位颜色。由于其无压缩的特点,BMP图像通常文件较大,但它也因此保留了完整的图像质量。

SDL2绘制BMP的原理

SDL2(Simple DirectMedia Layer 2)是一个跨平台的多媒体库,提供了对图形、音频、输入设备等的低级访问。SDL2绘制BMP图像的基本原理是加载BMP文件到内存中,然后将其绘制到窗口的表面上。SDL2通过SDL_Surface来表示图像表面,所有的绘制操作都是在SDL_Surface上进行的。

SDL2绘制BMP的流程

  1. 初始化SDL2 :首先,需要初始化SDL2库,包括视频子系统。可以使用SDL_Init函数来完成初始化。
  2. 创建窗口 :使用SDL_CreateWindow函数创建一个窗口,指定窗口的标题、位置、宽度和高度等属性。
  3. 获取窗口表面 :调用SDL_GetWindowSurface函数获取窗口的表面,所有的绘制操作将发生在这个表面上。
  4. 加载BMP图像 :使用SDL_LoadBMP函数加载BMP图像文件,并将其存储在一个SDL_Surface中。
  5. 绘制图像 :调用SDL_BlitSurface函数将BMP图像的表面绘制到窗口表面上。SDL_BlitSurface函数将源表面的内容复制到目标表面。
  6. 更新窗口表面 :使用SDL_UpdateWindowSurface函数更新窗口表面,使绘制的图像显示在窗口中。
  7. 处理延迟和清理 :调用SDL_Delay函数保持窗口显示一段时间,然后释放加载的图像表面和销毁窗口,最后调用SDL_Quit函数清理SDL2库。

SDL_LoadBMP

作用

SDL_LoadBMP 是一个用于加载 BMP 格式图像文件并创建一个包含该图像数据的 SDL_Surface 结构的函数。

函数原型
c 复制代码
SDL_Surface* SDL_LoadBMP(const char* file);
参数
  • file: 这是一个指向 BMP 文件路径的字符串。它指定了要加载的 BMP 图像文件的路径。
返回值
  • 成功时:返回一个指向 SDL_Surface 的指针,该结构包含了 BMP 图像数据。
  • 失败时:返回 NULL。可以使用 SDL_GetError 获取错误信息。
示例代码
cpp 复制代码
SDL_Surface* bmpSurface = SDL_LoadBMP("path/to/your/image.bmp");
if (!bmpSurface) {
    printf("SDL_LoadBMP Error: %s\n", SDL_GetError());
}

SDL_BlitSurface

作用

SDL_BlitSurface 是一个用于在两个表面之间进行图像复制的函数。通常用于将一个表面(源表面)的图像绘制到另一个表面(目标表面)上。

函数原型
c 复制代码
int SDL_BlitSurface(SDL_Surface* src, const SDL_Rect* srcrect, SDL_Surface* dst, SDL_Rect* dstrect);
参数
  • src: 这是一个指向源表面的指针,该表面包含要复制的图像。
  • srcrect: 这是一个指向 SDL_Rect 结构的指针,指定源表面的复制区域。如果为 NULL,则复制整个源表面。
  • dst: 这是一个指向目标表面的指针,该表面是图像将被复制到的地方。
  • dstrect: 这是一个指向 SDL_Rect 结构的指针,指定目标表面上的目标位置和尺寸。如果为 NULL,则图像会被复制到目标表面的左上角。
返回值
  • 成功时:返回 0
  • 失败时:返回一个负值。可以使用 SDL_GetError 获取错误信息。

示例代码

首先,我们如何通过普通图片获取得到BMP?

我们可以使用ffmpeg命令行来获取

c 复制代码
ffmpeg -i SDL2.jpg SDL2.bmp
c 复制代码
#include <SDL.h>
#include <stdio.h>
#include <SDL_rect.h>

int main(int argc, char* argv[]) {
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
    {
        return -1;
    }

    SDL_Window *window = SDL_CreateWindow("My First SDL2 Window", 100, 100, 500, 500, SDL_WINDOW_SHOWN);

    if (!window)
    {
        printf("Error:%s", SDL_GetError());
    }

    SDL_Surface *surface = SDL_GetWindowSurface(window);

    SDL_Surface* bmpSurface = SDL_LoadBMP("./SDL2.bmp");

    // 将BMP图像应用于窗口表面
    SDL_BlitSurface(bmpSurface, NULL, surface, NULL);

    SDL_UpdateWindowSurface(window);

    SDL_Delay(2000);
   
    SDL_DestroyWindow(window);
    surface = NULL;
    window = NULL;
    SDL_Quit();

    return 0;
}

效果展示


总结

本文介绍了如何使用SDL2库来绘制BMP图像,包括BMP格式的基本概念、SDL2绘制BMP的原理和具体流程。通过SDL2,我们可以方便地将BMP图像加载到内存中并绘制到窗口表面,实现图像的显示功能。希望本文能够帮助你更好地理解和使用SDL2进行图像处理。如果你正在开发一个需要图像显示的应用程序,SDL2将是一个强大且易于使用的工具。

相关推荐
chnming19871 分钟前
STL关联式容器之map
开发语言·c++
程序伍六七15 分钟前
day16
开发语言·c++
小陈phd32 分钟前
Vscode LinuxC++环境配置
linux·c++·vscode
火山口车神丶1 小时前
某车企ASW面试笔试题
c++·matlab
qystca1 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
runing_an_min1 小时前
ffmpeg视频滤镜:替换部分帧-freezeframes
ffmpeg·音视频·freezeframes
是阿建吖!1 小时前
【优选算法】二分查找
c++·算法
ruizhenggang1 小时前
ffmpeg本地编译不容易发现的问题 — Error:xxxxx not found!
ffmpeg
Ajiang28247353043 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
runing_an_min3 小时前
ffmpeg视频滤镜:提取缩略图-framestep
ffmpeg·音视频·framestep