示例代码
/**
* Title: 照片变换
*
* 到目前为止,我们的图像都是原始的。因为我们只展示了一张图片,所以没有关系。当你制作一款游戏时,
* 原始图像会导致不必要的速度减慢。我们将把它们转换成优化的格式以加快速度
* SDL 2还为SDL图层提供了一项称为软拉伸的新功能,该功能允许您对缩放到不同大小的图像进行 blit 在本教程中
* 我们将一个只有屏幕大小的一半的图像拉伸到全尺寸。
*/
#include <SDL2/SDL_image.h>
#include <SDL2/SDL.h>
#include <stdio.h>
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
#define sdlerror() { printf("error in line %d %s\n", __LINE__, SDL_GetError()); exit(-1); }
int main(int argc, char *argv[])
{
// 初始化
if(SDL_Init(SDL_INIT_VIDEO) < 0) sdlerror();
// 创建窗口
SDL_Window *window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
// 加载图片
SDL_Surface *imageSurface = SDL_LoadBMP("stretch.bmp");
if(imageSurface == NULL)
sdlerror();
SDL_Surface *screenSurface = SDL_GetWindowSurface(window);
/**
* 接下来就是本例程的重点,通过 SDL_ConvertSurface 函数, 把图层转换成优化的格式以加快速度
* 当您加载位图时,它通常是以24位格式加载的,因为大多数位图都是24位的。
* 大多数(不是全部)现代显示器在默认情况下不是24位的。
* 如果我们将一个24位的图像blit到一个32位的图像上,SDL会在每次图像blit时对其进行转换。
* 因此,当加载图像时,我们要做的是将其转换为与屏幕相同的格式,这样就不需要在Blit上进行转换
* 这可以使用SDL_ConvertSurface轻松完成。我们所要做的就是传入我们想要转换为屏幕格式的表面
* 需要注意的是,SDL_ConvertSurface以新格式返回原始文件的副本。在此调用之后,原始加载的图像仍在内存中。
* 这意味着我们必须释放原始加载的表面,否则内存中将有同一图像的两个副本
*/
SDL_Surface *newIimageSurface = SDL_ConvertSurface(imageSurface, screenSurface->format, 0);
SDL_FreeSurface(imageSurface);
imageSurface = NULL;
// 将图层放大并贴到主屏幕的图层上
SDL_Rect stretchRect;
stretchRect.x = 0;
stretchRect.y = 0;
stretchRect.w = SCREEN_WIDTH;
stretchRect.h = SCREEN_HEIGHT;
SDL_BlitScaled( newIimageSurface, NULL, screenSurface, &stretchRect );
SDL_UpdateWindowSurface(window);
// 等待退出
SDL_Event event;
while( SDL_PollEvent( &event ) != 0 || event.type != SDL_QUIT);
SDL_DestroyWindow(window);
SDL_FreeSurface(newIimageSurface);
SDL_Quit();
return 0;
}
运行结果
运行结果.png下面代码部分可以自己找一张 bmp 格式的图片来试
SDL_Surface *imageSurface = SDL_LoadBMP("stretch.bmp");
网友评论