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

举报
人才程序员 发表于 2024/07/28 20:31:25 2024/07/28
【摘要】 @TOC 前言在现代多媒体应用中,图像的处理和显示是非常重要的一部分。无论是在游戏开发还是在视频处理软件中,图像显示都是不可或缺的功能。本文将介绍如何使用SDL2库来绘制BMP图像,包括BMP的基本概念、SDL2绘制BMP的原理和具体的绘制流程。 BMP是什么BMP(Bitmap)是一种图像文件格式,通常用于存储数字图像。它由微软公司开发,并在Windows操作系统中广泛使用。BMP格式具有...

@TOC


前言

在现代多媒体应用中,图像的处理和显示是非常重要的一部分。无论是在游戏开发还是在视频处理软件中,图像显示都是不可或缺的功能。本文将介绍如何使用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将是一个强大且易于使用的工具。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。