zoukankan      html  css  js  c++  java
  • SDL2 gif动态图加载

    参照 https://tieba.baidu.com/p/3569073088?tpl=5&red_tag=1777318765

    使用mingw工具链

    #include <stdbool.h>
    #include <stdio.h>
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>
    
    #include "include/SDL_anigif.h"
    #define TITLE "SDL2 test gif"
    #define WINDOW_WIDTH 800
    #define WINDOW_HEIGHT 600
    
    int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
    
        SDL_Window *window = SDL_CreateWindow(TITLE, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
        SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    
        //获取gif图最大数量
        int gifMax = AG_LoadGIF("gif009.gif", NULL, 0);
        AG_Frame *frames = (AG_Frame *)malloc(sizeof(AG_Frame) * gifMax);
        AG_LoadGIF("gif009.gif", frames, gifMax);
    
        SDL_Rect rect = {0, 0, 0, 0};
    
        rect.w = frames[0].surface->w;
        rect.h = frames[0].surface->h;
    
        SDL_Texture **textures = (SDL_Texture **)malloc(sizeof(SDL_CreateTextureFromSurface(render, frames[0].surface)) * gifMax);
    
        int i;
        for (i = 0; i < gifMax; i++)
        {
            textures[i] = SDL_CreateTextureFromSurface(render, frames[i].surface);
        }
    
        bool quit = false;
        SDL_Event event;
        i = 0;
        while (!quit)
        {
            while (SDL_PollEvent(&event))
            {
                switch (event.type)
                {
                case SDL_QUIT:
                    quit = true;
                    break;
                }
            }
            // SDL_SetRenderDrawColor(render, 255, 200, 100, 100);
            SDL_RenderClear(render);
            SDL_RenderCopy(render, textures[i], NULL, &rect);
            i = (i + 1) % gifMax;
            SDL_RenderPresent(render);
            SDL_Delay(frames->delay);
        }
        free(frames);
        free(textures);
        SDL_DestroyRenderer(render);
        SDL_DestroyWindow(window);
        SDL_Quit();
    
        return 0;
    }

    编译指令 gcc  ./include/SDL_anigif.c  main.c  -o sdl_gif.exe -lmingw32 -mwindows -lSDL2main -lSDL2

     希望对大家有帮助

    #include <stdbool.h>
    #include <stdio.h>
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>

    #include "include/SDL_anigif.h"
    #define TITLE "SDL2 test gif"
    #define WINDOW_WIDTH 800
    #define WINDOW_HEIGHT 600

    int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);

        SDL_Window *window = SDL_CreateWindow(TITLE, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
        SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

        //获取gif图最大数量
        int gifMax = AG_LoadGIF("gif009.gif"NULL0);
        AG_Frame *frames = (AG_Frame *)malloc(sizeof(AG_Frame) * gifMax);
        AG_LoadGIF("gif009.gif", frames, gifMax);

        SDL_Rect rect = {0000};

        rect.w = frames[0].surface->w;
        rect.h = frames[0].surface->h;

        SDL_Texture **textures = (SDL_Texture **)malloc(sizeof(SDL_CreateTextureFromSurface(render, frames[0].surface)) * gifMax);

        int i;
        for (i = 0; i < gifMax; i++)
        {
            textures[i] = SDL_CreateTextureFromSurface(render, frames[i].surface);
        }

        bool quit = false;
        SDL_Event event;
        i = 0;
        while (!quit)
        {
            while (SDL_PollEvent(&event))
            {
                switch (event.type)
                {
                case SDL_QUIT:
                    quit = true;
                    break;
                }
            }
            // SDL_SetRenderDrawColor(render, 255, 200, 100, 100);
            SDL_RenderClear(render);
            SDL_RenderCopy(render, textures[i], NULL&rect);
            i = (i + 1% gifMax;
            SDL_RenderPresent(render);
            SDL_Delay(frames->delay);
        }
        free(frames);
        free(textures);
        SDL_DestroyRenderer(render);
        SDL_DestroyWindow(window);
        SDL_Quit();

        return 0;
    }
  • 相关阅读:
    MFC CListCtrl 使用介绍
    头文件预编译 .
    WM_CREATE和WM_INITDIALOG
    一步一步学List Control控件的用法(第三步)设置风格 .
    VC定时器的用法:SetTimer和Ontimer .
    GetWindowRect与GetClientRect 的区别 .
    Prebuild Command line(Copy) . vc2008预生成事件和生成后事件的用法
    MFC浅析(7) CWnd类虚函数的调用时机、缺省实现 .
    MFC中VALUE和CONTROL的区别(EDIT控件)
    MFC应用程序中处理消息的顺序
  • 原文地址:https://www.cnblogs.com/y-y-y-y/p/13125310.html
Copyright © 2011-2022 走看看