gif jumper

gif支持多帧动画,但是没有存储总帧数,解析gif直到结束才能知道总帧数。

所以gif解析代码,要么采用链表,要么不停realloc()分配内存,stb_image的代码就是如此。

出于本人的强迫症,于是写了一段代码,迅速“跳过”解析过程,返回总帧数,聊胜于无,仅供参考:

同时也可以作为gif格式的帮助文档,毕竟最好的文档就是代码。

格式

  • GIF文件头(Header)
  • 逻辑屏幕描述块(Logical Screen Descriptor)
  • 全局彩色表(GlobalColor Table)
  • 图像描述块(Image Descriptor)
  • 局部彩色表(Local Color Table)
  • 图形控制扩展块(Graphic Control Extension)
  • 注释扩展块(Comment Extension)
  • 应用扩展块(Application Extension)
  • 无格式文本扩展块(PlainText Extension)
  • 文件结束块(Trailer)

源码

#define JUMP(c, offset) c+=offset
#define INT8(n, offset) n=*offset
#define INT8_BIT(n, offset, s, e) n=(unsigned char)((*offset)<<s)>>(s+7-e)
static int gif_jumper(unsigned char *start, unsigned char *end)
{
int num=0;
int frames=0;
unsigned char *cur=start; JUMP(cur, 6); // Header(6bytes)
JUMP(cur, 4); // Logical Screen Descriptor(7bytes)
INT8_BIT(num, cur, 0, 0); // Global Color Table Flag
if(num) {
INT8_BIT(num, cur, 5, 7); // Size of Global Color Table = 2^(pixel+1)
JUMP(cur, 3+3*(1 << (num+1)));
} else {
JUMP(cur, 3);
} while(cur<end) {
INT8(num, cur);
switch(num) {
case 0x2C: // Image Descriptor(9bytes)
frames++;
JUMP(cur, 1+8);
INT8_BIT(num, cur, 0, 0); // Local Color Table Flag
if(num) {
INT8_BIT(num, cur, 5, 7); // Size of Local Color Table = 2^(pixel+1)
JUMP(cur, 1+3*(1 << (num+1)));
} else {
JUMP(cur, 1);
}
JUMP(cur, 1); // LZW Minimum Code Size
while(cur<end) {
INT8(num, cur); // Table-Based Image Data
JUMP(cur, 1+num);
if (num==0) {
break; // Block Terminator
}
}
break;
case 0x21: // Extension
JUMP(cur, 2); // Extension Introducer
while(cur<end) {
INT8(num, cur); // Table-Based Image Data
JUMP(cur, 1+num);
if (num==0) {
break; // Block Terminator
}
}
break;
case 0x3B: // Trailer
JUMP(cur, 1);
break;
default:
return 0;
}
};
return frames;
}

参考文档:

GIF文件格式详解

gif 格式图片详细解析

最简GIF解析代码gif_jumper,用于stb_image的小改进的更多相关文章

  1. [webpack]--webpack 如何解析代码模块路径

    前言 webpack是如何解析代码模块路径 webpack 中有一个很关键的模块 enhanced-resolve 就是处理依赖模块路径的解析的,这个模块可以说是 Node.js 那一套模块路径解析的 ...

  2. Delphi汉字简繁体转换代码(分为D7和D2010版本)

    //delphi 7 Delphi汉字简繁体转换代码unit ChineseCharactersConvert; interface uses   Classes, Windows; type   T ...

  3. UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv

    原文:UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) ...

  4. Beaver解析代码反向生成语法文件

    背景 Beaver是一款LALR的语法生成工具,现在有一个反编译项目的需求,需要将Beaver语法文件编译后的代码反向生成语法文件的需求,不去评论需求多么傻逼,直接干 设计 flowchart 语法文 ...

  5. QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection(QueryDet:用于加速高分辨率小目标检测的级联稀疏查询)

    QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection(QueryDet:用于加 ...

  6. js 日期计算星座 根据生日的月份和日期,一行代码计算星座的js小函数(转)

    本博客根据 开源中国作者清风徐不来 的文章 根据生日的月份和日期,一行代码计算星座的js小函数(转) 原文出自CSDN 无心的专栏 的文章,知识产权归原文作者所有! 点击查看原文:js 日期计算星座

  7. stl文件格式解析代码--java版

    代码是参考three.js中的stlLoader.js写的. 需要注意的地方,java中byte取值-128~127 package test_stl.test_entry; import java. ...

  8. PE格式文件的解析代码

    #include "Global.h" ; //标志,用于表示是否为pe32+文件 ; //标志,用于表示读入的模式,若为0代表是内存读入,不为0,代表是文件打开,此时mode是文 ...

  9. h264文件分析(纯c解析代码)

    参考链接:1. 解析H264的SPS信息 https://blog.csdn.net/lizhijian21/article/details/80982403               2. h.2 ...

  10. 你一定看得懂的 DDD+CQRS+EDA+ES 核心思想与极简可运行代码示例

    前言 随着分布式架构微服务的兴起,DDD(领域驱动设计).CQRS(命令查询职责分离).EDA(事件驱动架构).ES(事件溯源)等概念也一并成为时下的火热概念,我也在早些时候阅读了一些大佬的分析文,学 ...

随机推荐

  1. 如何在多个 Git 平台玩转一个仓库

    版本控制在软件开发中至关重要,而 Git 是广泛使用的代码管理工具.有时,我们可能需要在多个平台 (如 GitHub.GitLab 和 Gitee) 上同步同一 Git 仓库,以便备份.协作等. 本文 ...

  2. RestTemplate 介绍和用法

    RestTemplate 简介 RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求.POST 请求.PUT ...

  3. 改造 Kubernetes 自定义调度器

    原文出处:改造 Kubernetes 自定义调度器 | Jayden's Blog (jaydenchang.top) Overview Kubernetes 默认调度器在调度 Pod 时并不关心特殊 ...

  4. [USACO10OCT] Lake Counting S

    传送锚点:https://www.luogu.com.cn/problem/P1596 由于近期的降雨,雨水汇集在农民约翰的田地不同的地方.我们用一个 \(N\times M(1\leq N\leq ...

  5. 开发人员必知的5种开源协议(GPL、LGPL、BSD、MIT、Apache License)

    软件开源是许多软件企业需要关注的问题,不同的开源软件协议,对应不同的源代码使用限制.只有了解这些开源软件协议,才能更好地使用和回馈开源软件,否则就有可能触犯法律.今天介绍四种常见的开源软件协议: GP ...

  6. 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?

    一.写在开头     今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工 ...

  7. ra6m3之adc踩坑日志(基于rt-thread )

    问题描述 1.已经用fsp工具正确配置Pins 2.已经用fsp工具正确配置Stacks 3.问题是根本没有在RT-Thread Studio看到HAL相关的ADC代码,也没看到Settings里边的 ...

  8. 8.14考试总结(NOIP模拟39)[打地鼠·竞赛图·糖果·树]

    一举一动,都是承诺,会被另一个人看在眼里,记在心上的. T1 打地鼠 解题思路 数据范围比较小,不需要什么优化. 直接二维前缀和枚举右下角端点就好了. code #include<bits/st ...

  9. 01-布局扩展-用calc来计算实现双飞翼布局

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  10. axios 下载文件流

    axios 下载文件流 背景:在处理文件下载时,服务端存在校验,需要在请求头里添加token 这时直接使用 a 标签就不能满足需求.接下来我们直接通过 axios 请求,在请求头里设置 token 请 ...