浏览 4944 次
锁定老帖子 主题:*.gif 解码 - 理论
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-01
最后修改:2010-05-02
我们知道Android 默认是不支持*.gif 的 但是又需要这些功能 怎么办? 继续之
其实 *.gif 编码 解码 要详细说的话 估计1星期也说不出什么来 而且很快就会忘记 因为其组成也极其复杂 且没什么原因 所以 从国外anddev 淘来一份如何解码*.gif 的代码 现与诸位分析 看该代码 推荐与*.gif 解码 一起看 效果会更好的 否则 看完即忘 所以把*.gif 解码 也一起释放给大家
其实 如何解码*.gif并不是今天的重点 现在大概说下如何使用该接口
假设 该接口为:TypegifOpenHelper.java
[使用]
1. 创建TypegifOpenHelper
TypegifOpenHelper gHelper = new TypegifOpenHelper();
2. 现有gif文件:lion.gif 存放在 res\raw 目录
int id = R.raw.lion; gHelper.read(this.getResources().openRawResource(id));
3. 当然 以上仅仅是:从*gif中提取出所有Bitmap 而现在要求是显示连贯动画 所以我们还需要开辟一个Thread 用于隔段时间通知View 刷新图片 显示下一张 如此不断循环
以上是理论部分 改天演示如何使用该接口 并以组件View的形式 供 *.java *.xml 中使用!!!!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-07
悲哀 似乎大家更关注应用开发 不关心其原理
牢骚一下 |
|
返回顶楼 | |
发表时间:2010-05-07
怎么没有人支持啊?不过我还是第一次知道android不支持gif,我以为无所不能呢
|
|
返回顶楼 | |
发表时间:2010-05-07
呵呵 这个功能我一个月前完成了。。 只要按照gif的编码结构对文件进行解码,UI上自定义一个view,onDraw()方法画当前贞的bitmap,根据每一贞的delay控制一个线程去invalidate 就ok。。
另外 Android自带的Movie是可以播放gif的,但是如果图片太大,它可能加载不成功,或者播放时图像扭曲。不够健壮 自己写一个gif解码器就是了。 |
|
返回顶楼 | |
发表时间:2010-05-08
yzhong_sa 写道 呵呵 这个功能我一个月前完成了。。 只要按照gif的编码结构对文件进行解码,UI上自定义一个view,onDraw()方法画当前贞的bitmap,根据每一贞的delay控制一个线程去invalidate 就ok。。
另外 Android自带的Movie是可以播放gif的,但是如果图片太大,它可能加载不成功,或者播放时图像扭曲。不够健壮 自己写一个gif解码器就是了。 基本原理是这样的 不过我的代码 效率处理的不太好 其实可以一边解码 一边播放 会更好一点 特别 *.gif 比较大时 差别会比较明显 你有研究过这个么? |
|
返回顶楼 | |
发表时间:2010-05-09
由于项目中需要使用到GIF解码的东西,刚好在JE上看到,甚感幸福啊
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现 // read 8 bit data protected int readShort() { // read 16-bit value, LSB first return read() | (read() << 8 ); } 这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗? ############################## 不好意思发到另一个帖子上了,希望楼主能看到。呵呵 |
|
返回顶楼 | |
发表时间:2010-05-09
lishali12345 写道 由于项目中需要使用到GIF解码的东西,刚好在JE上看到,甚感幸福啊
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现 // read 8 bit data protected int readShort() { // read 16-bit value, LSB first return read() | (read() << 8 ); } 这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗? ############################## 不好意思发到另一个帖子上了,希望楼主能看到。呵呵 了解 没关系 至于你说的问题 应该不存在吧 因为目标是*.gif数据流 而不是pc 所以没有该必要 |
|
返回顶楼 | |
发表时间:2010-05-11
gryphone 写道 lishali12345 写道 由于项目中需要使用到GIF解码的东西,刚好在JE上看到,甚感幸福啊
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现 // read 8 bit data protected int readShort() { // read 16-bit value, LSB first return read() | (read() << 8 ); } 这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗? ############################## 不好意思发到另一个帖子上了,希望楼主能看到。呵呵 了解 没关系 至于你说的问题 应该不存在吧 因为目标是*.gif数据流 而不是pc 所以没有该必要 我想知道的是*.gif文件中存储short值是以小端字节序存储的吗?这个是GIF文件格式中的明确标准吗? 因为如果只是从程序解析流的层面上来讲,是很有必要考虑大小端的问题呢,要不然结果肯定是错误的。 |
|
返回顶楼 | |
发表时间:2011-01-02
最后修改:2011-01-02
楼主的解码器很好用, 不过里面有个protected boolean transparency我把他设成True后解析出来的gif背景还是黑色的, 我在其他的gif编辑器里确认过背景确是是透明的. 不知道还有哪里需要修改的?
|
|
返回顶楼 | |