Gif图像解码器

上一篇LZW压缩算法解码器实现中,实现了lzw压缩算法的解码,如果完成那一步,其实gif的解码已经实现大一半了,可以说攻克了技术难点,本文给出gif图像文件的解码器实现,对算法和gif图像有兴趣的同学可以下载下去研究。注:算法需要静下来来慢慢研究,心急气躁,急功近利者就免了,以防走火入魔,:)

声明:jillzhang的gif图像解码器有如下的特点

1)  解码效率很高,高到什么地步,大体上就是说能高到顶尖水平,基本上再改善算法,也不会有数量级上的提升了。举例来说比codeproject上NGif项目的解码器效率至少高200倍以上
2)  解码完全,按照gif的文件格式,能解析出所有的数据段,包括注释扩展块,应用程序扩展块,图形文本扩展块,逻辑屏幕描述等。
3)  将gif文件解析的更加完全,如果你看不懂长达 几千行的其他解码算法,你可以看看这个,看完后,就知道我这个庖丁是如何解牛的了,:)
4)  完全开放源码,而且会在后面的篇幅中逐步说明算法设计原理和实现思路

特别声明:美国Unisys公司申请了此格式所用到核心压缩算法LZW的专利保护,在没有向该公司交纳版税而获得授权的前提下都不能使用GIF格式进行创作和发布.但此项专利已经在2003年6月20号过期了, 而Unisys也没有继续申请专利延期(估计是被骂得太狼狈, 自己也不好意思了)。所以本文研究的Gif图像解码是合法的,但作者仍郑重声明:此实现只用于技术研究,请勿用于商业,否则后果自负。下载使用或者修改必须保留原作者信息:jillzhang,我在实现过程中也参考了NGif中的部分实现,实现代码中也有足够的声明。

本解码器的一些应用:

1)  获取gif的每一帧图像
2)  获取gif图像中的隐藏注释信息
3)  获取gif文件中隐藏的应用程序扩展信息
4)  获取gif文件中隐藏的文本信息
5)  获取gif文件的背景色
6)  获取gif文件的文件头
7) 
获取gif背景文件大小
8) 
获取gif文件的全局颜色表

解码器项目源文件:

 /Files/jillzhang/GifUtility.rar

目前可能出现的问题 :

1) Gif在编码中有两种数据排列方式,顺序方式和交织方式。顺序方式我已经有了比较多的测试,应该不会有问题,而交织方式的gif我一直没有找到,所以还没有来的急测试,可能会有异常,希望有人发现后,反馈给我。

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Gif,解码器
posted @ 2008-02-27 22:17 Robin Zhang 阅读(3591) 评论(24)  编辑 收藏 网摘 所属分类: 算法

  回复  引用  查看    
#1楼2008-02-27 22:26 | floodpeak      
张兄又发文了,呵呵
gif图像经常用,可是没想过细节,得向你学习呀

  回复  引用  查看    
#2楼[楼主]2008-02-27 22:31 | jillzhang      
@floodpeak
我们经常需要对图像进行水印,缩略,旋转,而这些需求通过一般的方法对gif图像,特别是动画是不能满足的,要完成对它的操作,就需要真正理解其文件格式和工作原理,利用其本质解决上述问题,我也是只是学习,关注这个文件格式有段时间了都。谢谢兄弟的捧场

  回复  引用  查看    
#3楼[楼主]2008-02-27 22:33 | jillzhang      
解码器相比编码器要简单,编码中有两个问题比较难解决
1)LZW编码
2)图像量化
先实现个简单的解码。

  回复  引用    
#4楼2008-02-27 22:49 | 航天奇侠
png 不是更好么

  回复  引用  查看    
#5楼[楼主]2008-02-27 22:55 | jillzhang      
@航天奇侠
个头太大,不能动画

  回复  引用  查看    
#6楼2008-02-27 22:59 | floodpeak      
呵呵,好说好说
目前我主要做桌面程序,图片方面就主要来做按钮图标,所以对png感情很深,至于gif,颜色深度太低了,忍不了
当然如果要动画,gif是不二选择

  回复  引用  查看    
#7楼2008-02-27 23:04 | 怪怪      
好东西, 支持LZ :)
  回复  引用  查看    
#8楼2008-02-27 23:24 | 怪怪      
看了一下LZ的代码, 都unsafe了, 效率肯定错不了 :)

不过我觉得还有几个可以优化的地方, 比如: 建立自己的一个Color的结构体, union一个包含RGBA的int, 不用.net的那个color, 然后指针操作的时候, 使用32位直接赋值, 或许还能更快一点.

VS这点挺讨厌的, 什么系统就是什么编码, 你用GB存的注释, 我看全是乱码 :(

  回复  引用  查看    
#9楼2008-02-28 01:57 | fox23      
追求更黄更暴力~ 呵呵
  回复  引用  查看    
#10楼2008-02-28 08:15 | Jeffery Huang      
请问楼主这个有没有带gif的加水印和缩略图的功能?谢谢
  回复  引用  查看    
#11楼2008-02-28 08:26 | 1-2-3      
高200倍以上……
太强了,佩服。不知道还有没有对GIF的详细解说,期待中。

  回复  引用  查看    
#13楼[楼主]2008-02-28 08:57 | jillzhang      
@1-2-3
会有的,嘿嘿。跟你学的也整了个logo,不过我截图了,没贴他的代码,:)
@fox23
:),现在这句话不流行亚,要说一定说很黄,很冠希,哈哈
@怪怪
同意,开始是这么想的,实现的时候,稍稍的偷了点懒

  回复  引用  查看    
#14楼2008-02-28 10:05 | Carrod      
@floodpeak
现在似乎有了apng,动画的~~

  回复  引用    
#15楼2008-02-28 10:07 | Intermapper[未注册用户]
很强,200倍以上!
  回复  引用  查看    
#16楼[楼主]2008-02-28 10:11 | jillzhang      
@Carrod
块头如何?
gif之所以流行,就是因为其高压缩率适应了网络应用的要求
而png虽然品质好,但块头大,很难再网站中应用。
我上面的logo,原来就是png的,打开页面速度明显就慢很多

  回复  引用  查看    
#17楼2008-02-28 11:14 | 米开狼基罗      
你的文件不加一个用户协议吗?
GIF比较小,动画,这两个非常好。
想放个图,但不管内容质量的时候,我用gif,屏幕截图我用png。

  回复  引用  查看    
#18楼2008-02-28 11:20 | 米开狼基罗      
你的gif decode 出来得产品是bmp吗?
  回复  引用  查看    
#19楼[楼主]2008-02-28 11:28 | jillzhang      
@米开狼基罗
decode出来的是Bitmap对象,我保存成为了png

  回复  引用  查看    
#20楼[楼主]2008-02-28 11:33 | jillzhang      
@米开狼基罗
你的文件不加一个用户协议吗?
--------------------
什么意思?

  回复  引用    
#21楼2008-02-28 17:28 | m[未注册用户]
@jillzhang
我猜是类似MSPL,GPL的这些东东吧
============
你的文件不加一个用户协议吗?
--------------------
什么意思?

  回复  引用    
#22楼2008-11-05 23:36 | kvb[未注册用户]
下不了啊,楼主可以发一份给我吗?谢谢!
我的邮箱 kkvvbb6@163.com

  回复  引用    
#23楼2009-02-12 18:11 | 咪咪[未注册用户]
求助:我的gif文件解码出来后,图像显示正确,可是颜色显示错误,和原来的图片颜色差距很大。是哪一部分的原因呢。请大侠帮忙
  回复  引用  查看    
#24楼2009-02-23 13:10 | 纸纹      
很像参考参考,可以也下不了了,lz可以发份到我邮箱么,谢谢了啊!
backnight@126.com




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1084196




相关文章:

相关链接: