论坛首页 移动开发技术论坛

*.gif 解码 - 理论

浏览 4944 次
精华帖 (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 中使用!!!!

 

 

   发表时间:2010-05-07  
悲哀 似乎大家更关注应用开发 不关心其原理
牢骚一下
0 请登录后投票
   发表时间:2010-05-07  
怎么没有人支持啊?不过我还是第一次知道android不支持gif,我以为无所不能呢
0 请登录后投票
   发表时间:2010-05-07  
呵呵  这个功能我一个月前完成了。。 只要按照gif的编码结构对文件进行解码,UI上自定义一个view,onDraw()方法画当前贞的bitmap,根据每一贞的delay控制一个线程去invalidate 就ok。。

另外 Android自带的Movie是可以播放gif的,但是如果图片太大,它可能加载不成功,或者播放时图像扭曲。不够健壮  自己写一个gif解码器就是了。
0 请登录后投票
   发表时间:2010-05-08  
yzhong_sa 写道
呵呵  这个功能我一个月前完成了。。 只要按照gif的编码结构对文件进行解码,UI上自定义一个view,onDraw()方法画当前贞的bitmap,根据每一贞的delay控制一个线程去invalidate 就ok。。

另外 Android自带的Movie是可以播放gif的,但是如果图片太大,它可能加载不成功,或者播放时图像扭曲。不够健壮  自己写一个gif解码器就是了。

基本原理是这样的 不过我的代码 效率处理的不太好 其实可以一边解码 一边播放 会更好一点 特别 *.gif 比较大时 差别会比较明显 你有研究过这个么?
0 请登录后投票
   发表时间: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值的方法是一致的吗?
##############################
不好意思发到另一个帖子上了,希望楼主能看到。呵呵
0 请登录后投票
   发表时间: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 所以没有该必要
0 请登录后投票
   发表时间: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文件格式中的明确标准吗?
因为如果只是从程序解析流的层面上来讲,是很有必要考虑大小端的问题呢,要不然结果肯定是错误的。
0 请登录后投票
   发表时间:2011-01-02   最后修改:2011-01-02
楼主的解码器很好用, 不过里面有个protected boolean transparency我把他设成True后解析出来的gif背景还是黑色的, 我在其他的gif编辑器里确认过背景确是是透明的. 不知道还有哪里需要修改的?
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics