参照 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, -, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); //获取gif图最大数量
int gifMax = AG_LoadGIF("gif009.gif", NULL, );
AG_Frame *frames = (AG_Frame *)malloc(sizeof(AG_Frame) * gifMax);
AG_LoadGIF("gif009.gif", frames, gifMax); SDL_Rect rect = {, , , }; rect.w = frames[].surface->w;
rect.h = frames[].surface->h; SDL_Texture **textures = (SDL_Texture **)malloc(sizeof(SDL_CreateTextureFromSurface(render, frames[].surface)) * gifMax); int i;
for (i = ; i < gifMax; i++)
{
textures[i] = SDL_CreateTextureFromSurface(render, frames[i].surface);
} bool quit = false;
SDL_Event event;
i = ;
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 + ) % gifMax;
SDL_RenderPresent(render);
SDL_Delay(frames->delay);
}
free(frames);
free(textures);
SDL_DestroyRenderer(render);
SDL_DestroyWindow(window);
SDL_Quit(); return ;
}

编译指令 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 
#define WINDOW_HEIGHT 
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, -, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    //获取gif图最大数量
    int gifMax = AG_LoadGIF("gif009.gif", NULL, );
    AG_Frame *frames = (AG_Frame *)malloc(sizeof(AG_Frame) * gifMax);
    AG_LoadGIF("gif009.gif", frames, gifMax);
    SDL_Rect rect = {, , , };
    rect.w = frames[].surface->w;
    rect.h = frames[].surface->h;
    SDL_Texture **textures = (SDL_Texture **)malloc(sizeof(SDL_CreateTextureFromSurface(render, frames[].surface)) * gifMax);
    int i;
    for (i = ; i < gifMax; i++)
    {
        textures[i] = SDL_CreateTextureFromSurface(render, frames[i].surface);
    }
    bool quit = false;
    SDL_Event event;
    i = ;
    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 + ) % gifMax;
        SDL_RenderPresent(render);
        SDL_Delay(frames->delay);
    }
    free(frames);
    free(textures);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return ;
}

SDL2 gif动态图加载的更多相关文章

  1. ie6,7下js动态加载图片不显示错误

    ie6,7下js动态加载图片不显示错误 先描述一下出现这种匪夷所思bug的背景: 我在页面加载的时候加载一堆小缩略图,<a href="javascript:void(0);" ...

  2. Unity使用脚本进行批量动态加载贴图

    先描述一下我正在做的这个项目,是跑酷类音游. 那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题.假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢? 我花了好几个小时才搞 ...

  3. js动态加载css和js

    之前写了一个工具类点此链接里面含有这段代码,感觉用处挺多,特意提出来 var loadUtil = { /* * 方法说明:[动态加载js文件css文件] * 使用方法:loadUtil.loadjs ...

  4. geotrellis使用(二十三)动态加载时间序列数据

    目录 前言 实现方法 总结 一.前言        今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...

  5. Ext JS 如何动态加载JavaScript创建窗体

    JavaScript不需要编译即可运行,这让JavaScript构建的应用程序可以变得很灵活.我们可以根据需要动态从服务器加载JavaScript脚本来创建和控制UI来与用户交互.下面结合Ext JS ...

  6. Ext动态加载Toolbar

    在使用Ext的GridPanel时候,有时候需要面板不用重新加载而去更新Store或者Toolbar,Store的方法有很多,例如官方api给我们提供的Store.load(),Store.reLoa ...

  7. Android动态加载框架汇总

    几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...

  8. 为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件

    为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件.样式文件命名格式如:forms[_屏幕宽度].css,样式文件中只需重新定义文本框和下拉框的宽度即可. 在包含的头文件 ...

  9. html中的图像动态加载问题

    首先要说明下文档加载完成是什么概念 一个页面http请求访问时,浏览器会将它的html文件内容请求到本地解析,从窗口打开时开始解析这个document,页面初始的html结构和里面的文字等内容加载完成 ...

随机推荐

  1. JavaDoc文件如何生成

    目录 如何使用 1.通过命令行生成JavaDoc文档 2.IDEA如何配置后生成javadoc文档 javadoc命令是用来生成自己的API文档的 参考信息: @author 作者名 @version ...

  2. 51Nod - 1255

    也是第十一届校赛的C题,不过他把1e5改成了1e7. 一开始就想到用贪心做.思路是这样的:开一个字符数组ans保存答案.然后从头到尾遍历题目给出的字符串S,如果ans数组中还没有这个字母,那么就把字母 ...

  3. Kattis - entertainmentbox

    题目链接:https://vjudge.net/problem/Kattis-entertainmentbox 题目大意: 一种叫做不知道什么的盒子可以同时录 k 个节目,现给出 n 个节目的开始和结 ...

  4. Kubernetes学习笔记(五):卷

    简介 卷是Pod的一部分,与Pod共享生命周期.它不是独立的Kubernetes对象,因此不能单独创建. 卷提供的存储功能不但可以解决容器重启后数据丢失的问题,还可以使数据在容器间共享. 一些卷的类型 ...

  5. Oracle 中同义词使用

    一.数据库对象: 模式对象: 数据库对象是逻辑结构的集合,最基本的数据库对象是表; 其他对象包括:create增.drop删.改alter 同义词.序列.视图.索引 1.同义词: ①. 现有对象的一个 ...

  6. 001_C语言中运算符的优先级

    总的来说就是: 1. 最高:单目运算符(() > * 解引用,&取地址,-取相反数,++等自增(或减)运算,!取反运算...); 2. 次之:双目运算符(算数运算符 > 移位运算符 ...

  7. NO.5 CCS运行demo(云端)

    我们在demo的README中发现如果程序在云端运行会有很酷的界面而且功能会多一些. 首先我们在CCS开始界面点击Resourse Explorer 然后在浏览器中找到对应的demo 打开GUI界面, ...

  8. js中 addEventListener 和removeEventListener

    js中添加事件监听本来是非常常见的事情,但是去除监听一般很少去干,最近项目中需要监听页面显示或者隐藏 代码如下 document.addEventListener(visibilitychange', ...

  9. [Python番外]001.用Sublime开发Python

    用Sublime开发Python 准备 安装Package Control插件 安装Python插件 Python环境配置 修改快捷键 准备 安装Python 详见 Python准备 下载Sublim ...

  10. InnoSetup汉化版打包工具下载-附带脚本模板

    InnoSetup汉化版打包工具下载地址: https://www.90pan.com/b1907264 脚本模板 ; 脚本用 Inno Setup 脚本向导 生成.; 查阅文档获取创建 INNO S ...