您的位置:首页 > 财经 > 金融 > 【音视频之SDL2】bmp图片与绘制bmp

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

2024/12/23 10:16:52 来源:https://blog.csdn.net/m0_62599305/article/details/140695159  浏览:    关键词:【音视频之SDL2】bmp图片与绘制bmp

文章目录

  • 前言
    • BMP是什么
    • SDL2绘制BMP的原理
    • SDL2绘制BMP的流程
      • SDL_LoadBMP
        • 作用
        • 函数原型
        • 参数
        • 返回值
        • 示例代码
      • SDL_BlitSurface
        • 作用
        • 函数原型
        • 参数
        • 返回值
    • 示例代码
    • 效果展示
      • 总结


前言

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com