SDL2渲染RGB图像

SDL 的相关函数

SDL2渲染RGB图像_第1张图片

SDL2渲染RGB图像_第2张图片 SDL2渲染RGB图像_第3张图片

SDL2渲染RGB图像_第4张图片

 

使用 SDL 渲染 RGB 图像 

#include 
#include 
#include 

#undef main

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

using namespace std;

int main()
{
	const int w = 800;
	const int h = 600;

	// 1. 初始化 SDL Video 库
	if (SDL_Init(SDL_INIT_VIDEO))
	{
		cout << SDL_GetError() << endl;

		return -1;
	}

	// 2. 创建 SDL 窗口
	auto window = SDL_CreateWindow("window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);

	if (!window)
	{
		cout << SDL_GetError() << endl;

		return -2;
	}

	// 3. 创建渲染器
	auto renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

	if (!renderer)
	{
		cout << SDL_GetError() << endl;

		return -3;
	}

	// 4. 创建材质
	auto texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h);

	if (!texture)
	{
		cout << SDL_GetError() << endl;

		return -4;
	}

	shared_ptr pixels(new unsigned char[w * h * 4]);
	unsigned char* p = pixels.get();
	unsigned char tmp = 255;

	while (1)
	{
		/* 判断退出 */
		SDL_Event evt;

		SDL_WaitEventTimeout(&evt, 10);  // 如果一直没有事件,则阻塞 10ms,时间一到就继续向下执行

		if (evt.type == SDL_QUIT)
		{
			SDL_DestroyWindow(window);
			break;
		}

		/* 修改每个像素点的颜色 */
		for (int i = 0; i < h; i++)
		{
			int b = i * w * 4;  // 每一行的起始字节处

			for (int j = 0; j < w * 4; j += 4)
			{
				p[b + j] = 0;        // B
				p[b + j + 1] = 0;    // G
				p[b + j + 2] = tmp;  // R
				p[b + j + 3] = 0;    // A
			}
		}

		tmp--;

		// 5. 更新材质
		SDL_UpdateTexture(texture, NULL, p, w * 4);

		// 6. 清屏
		SDL_RenderClear(renderer);

		SDL_Rect dst;

		dst.x = 0;
		dst.y = 0;
		dst.w = w;
		dst.h = h;

		// 7. 复制材质到渲染器
		SDL_RenderCopy(renderer, texture, 
			nullptr,  // 原图位置和尺寸 
			&dst      // 目标位置和尺寸
		);

		// 8. 渲染
		SDL_RenderPresent(renderer);
	}

	getchar();
	
	return 0;
}

你可能感兴趣的:(音视频,音视频)