SDL基础使用03(渲染显示bmp图片)

本文详细介绍了如何使用SDL库在C++中创建窗口、加载BMP图片、创建纹理,并通过渲染器进行显示的过程,包括初始化、窗口创建、纹理处理和资源释放等关键步骤。
摘要由CSDN通过智能技术生成

 基于渲染器 显示bmp图片

  •     1. 初始化SDL                           SDL_Init
  •     2. 创建窗口                              SDL_CreateWindow
  •     3. 基于窗口创建渲染器            SDL_CreateRenderer
  •     4. 加载bmp图片到surface        SDL_LoadBMP
  •     5. 根据图片surface创建纹理    SDL_CreateTextureFromSurface
  •     6. 绘制三部曲

        清空渲染器上一次显示        SDL_RenderClear
        拷贝纹理数据到渲染器        SDL_RenderCopy
        更新渲染器显示                   SDL_RenderPresent

  •     7. 释放资源,退出            SDL_FreeSurface......
#include <iostream>
/* 纹理和渲染(渲染显示bmp图片) */
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.lib")


#undef main
int main()
{
	// 1. 初始化
	int nRet = SDL_Init(SDL_INIT_EVERYTHING);
	if (nRet < 0)
	{
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 2. 创建窗口
	SDL_Window* pWnd = SDL_CreateWindow("Title",
		SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
		640, 480,
		SDL_WINDOW_SHOWN);
	if (NULL == pWnd)
	{
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 3. 创建渲染		SDL_RENDERER_ACCELERATED   GPU硬件加速渲染
	SDL_Renderer* pRenderer = SDL_CreateRenderer(pWnd, -1, SDL_RENDERER_ACCELERATED); 
	if (NULL == pRenderer)
	{
		SDL_DestroyWindow(pWnd);
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 4. 加载bmp图片到surface
	SDL_Surface* pSurface = SDL_LoadBMP("./Panda.bmp");		// 加载bmp图片
	if (NULL == pSurface)
	{
		SDL_DestroyRenderer(pRenderer);
		SDL_DestroyWindow(pWnd);
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	SDL_Rect rect = { 0, 0, pSurface->w - 50, pSurface->h + 50 };
	// 5. 根据Surface创建纹理
	SDL_Texture*  pTexture = SDL_CreateTextureFromSurface(pRenderer, pSurface);
	if (NULL == pTexture)
	{
		SDL_FreeSurface(pSurface);
		SDL_DestroyRenderer(pRenderer);
		SDL_DestroyWindow(pWnd);
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 6. 绘制三部曲
	SDL_RenderClear(pRenderer);								// 清空一下渲染器(防止有残留的数据)							
	SDL_RenderCopy(pRenderer, pTexture, &rect, &rect);		// 将纹理数据拷贝到渲染器缓冲区中
	SDL_RenderPresent(pRenderer);							// 刷新渲染器显示

	SDL_Delay(2000);

	// 7. 释放资源,退出
	// 释放表面
	if (pSurface)
	{
		SDL_FreeSurface(pSurface);
	}
	// 释放纹理
	if (pTexture)
	{
		SDL_DestroyTexture(pTexture);
	}
	// 释放渲染
	if (pRenderer)
	{
		SDL_DestroyRenderer(pRenderer);
	}
	// 释放窗口
	if (pWnd)
	{
		SDL_DestroyWindow(pWnd);
	}
	SDL_Quit();

	return 0;
}
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

石小浪♪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值