美文网首页
SDL 教程 05 : 照片变换

SDL 教程 05 : 照片变换

作者: wjundong | 来源:发表于2020-02-18 23:53 被阅读0次

示例代码

/**
 * 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");

相关文章

网友评论

      本文标题:SDL 教程 05 : 照片变换

      本文链接:https://www.haomeiwen.com/subject/dpkofhtx.html