美文网首页
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