参照 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. mac OS和win7笔记本实现文件共享

    记录下macbook通过共享读取win7笔记本中文件的过程,条件是两台电脑处于同一无线网中 win7操作 点击网络图标--属性--更改高级共享设置 选择公用后选择以下选项:启动网络发现--启动文件和打 ...

  2. php 序列化

    PHP serialize() 函数 serialize() 函数用于序列化对象或数组,并返回一个字符串. serialize() 函数序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和 ...

  3. HashMap集合嵌套集合方法四种

    Map<String, HashMap<Person, String>> m=new HashMap<String, HashMap<Person, String& ...

  4. 基于 kubeadm 搭建高可用的kubernetes 1.18.2 (k8s)集群一 环境准备

    本k8s集群参考了 Michael 的 https://gitee.com/pa/kubernetes-ha-kubeadm-private 这个项目,再此表示感谢! Michael的项目k8s版本为 ...

  5. [翔哥高手无敌之路]0-002.如何提取apk中的信息?

    面对一款apk软件,我们如何去获取它的信息,如何获取它的版本号,包名,或者ID,用户权限,这些信息都隐藏在apk包中的AndroidManifest.xml文件中,解开它我们就能获取任何想要的信息.但 ...

  6. HttpSession之表单的重复提交 & 验证码

    如果采用 HttpServletResponse.sendRedirct() 方法将客户端重定向到成功页面,将不会出现重复提交问题 1.表单的重复提交 1). 重复提交的情况: ①. 在表单提交到一个 ...

  7. HttpSession之简易购物车

    创建一个简单的购物车模型,由三个 jsp 和两个 Servlet 组成: step1.jsp <%@ page language="java" contentType=&qu ...

  8. 搭建Nexus Repository包管理系统

    搭建Nexus Repository包管理系统 下载安装程序 下载Nexus Repository最新版本 配置说明 将下载后的文件传输到服务器上 #修改配置文件 vi /etc/security/l ...

  9. SSL/TLS/WTLS

    转载来自http://blog.csdn.net/fw0124/article/details/8470940 一 前言 首先要澄清一下名字的混淆: 1 SSL(Secure Socket Layer ...

  10. 树莓派 Ubuntu Mate更换中国软件源

    更换步骤: 1.以root身份打开 /etc/apt/sources.list ,可以用vim或者nano 2.将 http://ports.ubuntu.com/ 全部替换为 http://mirr ...