【音视频之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 结构的函数。

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

SDL_BlitSurface

作用

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

函数原型
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命令行来获取

ffmpeg -i SDL2.jpg SDL2.bmp
#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将是一个强大且易于使用的工具。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值