开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 34985|回复: 234
收起左侧

[易语言纯源码] [开源]基于 易 实现的Gif图片分割器,提取GIf图片中的每一帧

    [复制链接]

结帖率:100% (53/53)
发表于 2017-2-2 20:39:37 | 显示全部楼层 |阅读模式   福建省宁德市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 aqwvwv 于 2017-2-2 20:45 编辑

[开源]基于 易 实现的Gif图片分割器,提取GIf图片中的每一帧                                                                                                                     
不知不觉又好几天没有更新发新帖了,刚刚研究完成,来分享一下研究成果。说明:我发帖都是发质量良心帖,都有助于易友学习进步的,同时也希望觉得内容不错的易友,请多支持下,多加分、多点评、多进步,研究不易哎
  在网上,我们经常看到各种各样的图片,尤其是GIF图片的动态效果,让整个网站更加富有表现力!有时候,我们看到一些比较好看的GIF图片或者一些奇特的Gif图片,我们想要停留在某一帧看的清楚一点或者了解这个Gif动画到底是怎么实现的,怀着这种好奇的心理,我们来看一下,今天的开源项目,用 易 来实现GIF图片的预览和分离和保存。
一、 GIF图片基本结构和原理
1、GIF简介
  GIF(Graphics Interchange Format)是CompuServe公司开发的图像文件存储格式,1987年开发的GIF文件格式版本号是GIF87a,1989年进行了扩充,扩充后的版本号定义为GIF89a。 GIF图像文件以数据块(block)为单位来存储图像的相关信息。一个GIF文件由表示图形/图像的数据块、数据子块以及显示图形/图像的控制信息块组成,称为GIF数据流(Data Stream)。数据流中的所有控制信息块和数据块都必须在文件头(Header)和文件结束块(Trailer)之间。
  GIF文件格式采用了LZW(Lempel-Ziv Walch)压缩算法来存储图像数据,定义了允许用户为图像设置背景的透明(transparency)属性。此外,GIF文件格式可在一个文件中存放多幅彩色图形/图像。如果在GIF文件中存放有多幅图,它们可以像演幻灯片那样显示或者像动画那样演示。
2、GIF文件结构
GIF文件结构的典型结构如图1-01所示。为下文说明方便,在图片右边加了编号。
232237498023989.png 图1-01
数据块可分成3类:
控制块(Control Block),图形描绘块(Graphic-Rendering Block)和专用块(Special Purpose Block)。
(1) 控制块:
控制块包含有用来控制数据流(Data Stream)或者设置硬件参数的信息,其成员包括:
GIF文件头(Header)
逻辑屏幕描述块(Logical Screen Descriptor)
图形控制扩展块(Graphic Control Extension)
文件结束块(Trailer)

(2) 图形描绘块:
包含有用来描绘在显示设备上显示图形的信息和数据,其成员包括:
图像描述块(Image Descriptor)
无格式文本扩展块(Plain Text Extension)
全局调色板、局部调色板、图像压缩数据和图像说明扩充块。

(3) 特殊用途数据块:
包含有与图像处理无关的信息,其成员包括:
注释扩展块(Comment Extension)
应用扩展块(Application Extension)
除了在控制块中的逻辑屏幕描述块(Logical Screen Descriptor)和全局彩色表(Global Color Table)的作用范围是整个数据流(Data Stream)之外, 所有其他控制块仅跟在它们后面的图形描绘块。

3、GIF结构详解
由于GIF结构比较复杂,我们就简单讲解一下GIF的文件头吧,因为我们要用到,更多的资料请参看百度文库:http://wenku.baidu.com/view/2c0feaa6f524ccbff121841d.html
(1)文件头描述块(Header)定义GIF数据流(GIF Data Stream),它的结构如图1-02所示。文件头描述块(Header)由GIF标记域(Signature)和版本号(Version)域组成,是一个由6个固定字节组成的数据块,它们用来说明使用的文件格式是GIF格式及当前所用的版本号。GIF标记域(Signature)存放的是“GIF”,版本号域存放的是1987年5月发布的“87a”或者1989年7月发布的“89a”,或者更加新的版本号。
232246418803842.png 1-02
这里我们识别一个图片是不是GIF文件,就是判断文件的前三个字节是不是GIF,就算是图片呗重命名为jpg或者其他的,只要用浏览器打开,都是可以正常显示的,这也就是为什么有些jpg图片也会动的原因。同理PNG图片的前三个图片是PNG.
(2)逻辑屏幕描述块(Logical Screen Descriptor)包含定义图像显示区域的参数,包括背景颜色信息。这个数据块中的坐标相对于虚拟屏幕的左上角,不一定是指显示屏的绝对坐标,这就意味可以参照窗口软件环境下的窗口坐标或者打印机坐标来设计图像显示程序。逻辑屏幕描述块的结构如图1-03所示
232249308022682.png 1-03
这里我们看到GIF的字段,可以读取GIF图片的实际高度和宽度,到这里就差不多了,其他的大家看百度文库的文档吧,我就不再说了。
二、 GIF分解工具简介
  上面给大家讲了那么多的GIF文件的东西,可能大家看的有点不耐烦,目的主要是为了让大家了解GIF的结构,这样才能更好的读懂项目里面的代码。下面来看一段读取GIF文件信息的代码,体会一下:
  
临时字节集 = gif图片
标识 = 到文本 (取字节集左边 (临时字节集, 3))  ' 前3个字节,标识"GIF"
版本号 = 到文本 (取字节集中间 (临时字节集, 4, 3))  ' 3~6三个字节为版本号(通常为89a,表示1989年的版本,还有一个版本为87a,为1987年的,具体百度)
_宽度 = 到整数 (取字节集数据 (取字节集中间 (临时字节集, 7, 2), #长整数型, ))  ' 7~8两个字节为宽度 通常为uint16位无符号整数,所以要通过取字节集数据才能解析
_高度 = 到整数 (取字节集数据 (取字节集中间 (临时字节集, 9, 2), #长整数型, ))  ' 9~10两个字节为高度 通常为uint16位无符号整数,所以要通过取字节集数据才能解析

这段代码读取和显示GIF的标识、版本号、宽度和高度信息。可以看到,都是读取文件的特定的几个字节。
下面来看看这个开源项目的界面吧,首先GIF图片,如下:
232300581306764.gif
看起来很炫,是吧,然后我们来看看到底都有哪些帧组成的,如图:
232259445526852.png
我们可以看到GIF的版本号和帧数,一共是8帧,也就是八张图片,我们点击另存为,输入图片名称,如Img,保存每一帧图片,如图:
232304515673182.png
我们看到,八张图片都分离出来了,看起来好漂亮啊,图片的名字就是我们刚才输入的名称后面加上编号。
下面我们来看几个比较神秘的GIF,如下图:
无限循环.gif 232308054895326.gif 232312189745499.gif
这几张图片看起来是无限循环的,没有停顿,那么他们到底有多少帧呢?这个就留给大家去探索吧!
232338517862713.gif
叫你看完不评分、见你看完不评分
三、 GIF分割者源码下载链接    【回复可见】
GIF分割者源码.zip (41.28 KB, 下载次数: 1460)

点评

合成也很简单,你们按照例子中演示的gif图片,按照源码中提取出头部分,中间部分以图片+分隔符,结尾以{59}结尾,实际上只要按照分割部分,逆向组合应该就可以了   福建省宁德市  发表于 2017-2-10 00:16
感谢福仔的666支持   福建省宁德市  发表于 2017-2-2 21:23

评分

参与人数 14好评 +10 精币 +28 收起 理由
冰点 + 1 + 5 支持开源~!感谢分享
钱乐 + 1 支持开源~!感谢分享
进击 + 1 + 2 你的内容排版很舒服,谢谢!
天空飞翔 + 1 + 2 奉上小小红包希望笑纳
a1501671226 + 1 支持开源~!感谢分享
酷易自绘 + 1 + 2 希望楼主可以写个合成的,既然可以解析,应该就可以合成
MrSimple + 1 + 2 支持开源~!感谢分享
冯古屋 + 1 + 1 感谢分享,很给力!~
UserXCh + 1 支持开源~!感谢分享
猥琐小胖子 + 1 + 3 请注意,另存为是全部图片。我以为是选择的单张图 T_T
然后 + 1 + 1 支持开源~!感谢分享
名无所谓 + 1 + 2 支持开源~!感谢分享
汉族 + 2 提示 内存不足 还得继续升级裁成啊
福仔 + 1 + 3 新技能已get√

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (2/2)
发表于 2023-8-8 14:40:52 | 显示全部楼层   广东省揭阳市
感谢感谢,试试看
回复 支持 反对

使用道具 举报

发表于 2023-8-7 06:35:02 高大上手机用户 | 显示全部楼层   浙江省杭州市
拿走学习
回复 支持 反对

使用道具 举报

签到天数: 5 天

发表于 2023-4-17 01:18:35 | 显示全部楼层   黑龙江省哈尔滨市
回复 支持 反对

使用道具 举报

结帖率:86% (24/28)

签到天数: 15 天

发表于 2023-4-13 00:46:56 | 显示全部楼层   河南省郑州市
拿走学习了
回复 支持 反对

使用道具 举报

发表于 2022-11-3 05:31:06 | 显示全部楼层   福建省宁德市
6666666666666666666666666666
回复 支持 反对

使用道具 举报

发表于 2022-9-11 13:14:51 | 显示全部楼层   广东省深圳市
支持,膜拜大佬!
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2022-7-14 16:44:37 | 显示全部楼层   四川省德阳市
学习学习
回复 支持 反对

使用道具 举报

结帖率:17% (5/30)

签到天数: 1 天

发表于 2022-6-14 15:26:01 | 显示全部楼层   四川省宜宾市
必须支持这个。。
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2022-6-10 09:50:19 | 显示全部楼层   上海市上海市
感谢分享,支持开源
回复 支持 反对

使用道具 举报

结帖率:100% (30/30)
发表于 2022-5-5 12:20:12 | 显示全部楼层   河南省三门峡市
感谢分享啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表