参照 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. 第二篇-用Flutter手撸一个抖音国内版,看看有多炫

    前言 继上一篇使用Flutter开发的抖音国际版 后再次撸一个国内版抖音,大部分功能已完成,主要是Flutter开发APP速度很爽,  先看下图 项目主要结构介绍 这次主要的改动在api.dart 及 ...

  2. CPU上下文切换以及相关指标的理解

      前言 上下文切换这个词一直不理解,看了无数遍就忘了无数遍,知道看到<操作系统导论>这本书,终于有了略微的理解.这也证明了我的方向是没错的,一直认为做运维还是得理解底层的知识,不理解很多 ...

  3. 去掉shiro登录时url里的JSESSIONID https://blog.csdn.net/aofavx/article/details/51701012

    经过查找论坛和分析源码,确认了是在ShiroHttpServletResponse里加上的. 因此继承ShiroHttpServletResponse类,覆盖相应方法,再重写 ShiroFilterF ...

  4. js数组取出非重复元素

    接地气,兼容性好,支持IE8) function diff(arr1,arr2){ var a = []; var b = []; for(var i=0;i<arr2.length;i++){ ...

  5. 深入理解JS:执行上下文中的this(二)

    目录 序言 Function.prototype.bind() 方法 箭头函数 参考 1.序言 在 深入理解JS:执行上下文中的this(一) 中,我们主要深入分析全局环境和函数环境中函数调用的 th ...

  6. 【转】产生n个100以内的随机数,且不能重复

    如何高效产生m个n范围内的不重复随机数(m<=n) 给出的perl写法,以及 JAVA随机数之多种方法从给定范围内随机N个不重复数 的方法三: /** * 随机指定范围内N个不重复的数 * 在初 ...

  7. 一、【python】机器学习基础

    专有名词 机器学习 (machine learning) 预测分析 (predictive analytics) 统计学习 (statistical learning) 监督学习 (supervise ...

  8. PSR-4 的实现示例

    闭包实例 <?php /** * 一个具体项目实现的示例. * * 在注册自动加载函数后,下面这行代码将引发程序 * 尝试从 /path/to/project/src/Baz/Qux.php * ...

  9. jQuery-ajax请求使用

    1.jQuery中的ajax $.ajax({ url:'地址', type:'get/post', data:{}, dataType:'json/jsonp', success:function( ...

  10. Beta冲刺——代码规范与计划

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.代码规范 采用ShowDoc网站进行编 ...