sdl2顯示bmp圖片

推廣 ffplay + sdl2 + vs2010


sdl2 修改和添加了部分接口,並且增加了對手機系統平臺(ios,andriod)的支持,顯示部分改動較大,並且不向下兼容,具體可以參考官方 http://wiki.libsdl.org/MigrationGuide#Other_Renderer_API_notes

以下是使用sdl2顯示一張bmp圖片的demo

#include "stdafx.h"

#include "SDL.h"

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


int _tmain(int argc, _TCHAR* argv[])
{
	SDL_Window *window;                    // Declare a pointer

	SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2

	//SDL_EventState(SDL_WINDOWEVENT_FOCUS_GAINED, SDL_IGNORE);
	//SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
	//SDL_EventState(SDL_USEREVENT, SDL_IGNORE);

	// Create an application window with the following settings:
	window = SDL_CreateWindow(
		"An SDL2 window",                  // window title
		50,           // initial x position
		50,           // initial y position
		640,                               // width, in pixels
		480,                               // height, in pixels
		SDL_WINDOW_OPENGL |SDL_WINDOW_RESIZABLE                // flags - see below
		);

	// Check that the window was successfully made
	if (window == NULL) {
		// In the event that the window could not be made...
		printf("Could not create window: %s\n", SDL_GetError());
		return 1;
	}
	//SDL_SetWindowFullscreen(window,SDL_WINDOW_FULLSCREEN);
	int w =1024,h=768; //w,h應該設置爲圖片原始大小
	SDL_Renderer* render = SDL_CreateRenderer(window, -1,0);
	SDL_Texture* texture = SDL_CreateTexture(render,
<span style="white-space:pre">			</span>SDL_PIXELFORMAT_BGR24,SDL_TEXTUREACCESS_STREAMING,w,h);

	FILE* f = fopen("d:\\media\\1.bmp","rb");
	fseek(f,0,SEEK_END);
	long size = ftell(f);
	fseek(f,0,SEEK_SET);
	char* buffer = new char[size];
	fread(buffer,size,1,f);
	int offset = *((int*)(buffer+10));
	char* p = buffer + offset;
	char* bmp = new char[size-offset];
	for (int i=0; i< h;i++)
	{
		memcpy(bmp+i*1024*3,buffer+offset+(h-i-1)*1024*3,1024*3);
	}
	
	
	

	SDL_Rect rect;
	rect.x = 0;
	rect.y = 0;
	rect.w = w;
	rect.h = h;

	SDL_UpdateTexture(texture,0,bmp,3*w);
	SDL_RenderClear(render);
	SDL_RenderCopy(render, texture, NULL, NULL);
	SDL_RenderPresent(render);

	
	SDL_Event event1;
	
	// The window is open: enter program loop (see SDL_PollEvent)
	while(true){
		//SDL_Delay(300);  // Pause execution for 3000 milliseconds, for example
		SDL_PumpEvents();
		SDL_PeepEvents(&event1, 1, SDL_GETEVENT, SDL_FIRSTEVENT,SDL_LASTEVENT);
		if(event1.type == SDL_WINDOWEVENT)
		{
			switch (event1.window.event) {
			case SDL_WINDOWEVENT_RESIZED:
				SDL_UpdateTexture(texture,0,bmp,3*w);
				SDL_RenderClear(render);
				SDL_RenderCopy(render, texture, NULL, NULL);
				SDL_RenderPresent(render);
				break;
			default :
				break;
			}
		}
		else if (event1.type==SDL_KEYDOWN)
		{
			switch (event1.key.keysym.sym)
			{
			case SDLK_f:
				SDL_SetWindowFullscreen(window,SDL_WINDOW_FULLSCREEN_DESKTOP);
				break;
			case SDLK_g:
				SDL_SetWindowFullscreen(window,0);
				break;
			case SDLK_q:
				exit(-1);
				break;
			}
		}
	}
	delete[] bmp;
	delete[] buffer;
	// Close and destroy the window
	SDL_DestroyWindow(window);

	// Clean up
	SDL_Quit();
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章