package com.ant.liao;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.util.Log;
public class GifDecoder extends Thread{
/**状态:正在解码中*/
public static final int STATUS_PARSING = 0;
/**状态:图片格式错误*/
public static final int STATUS_FORMAT_ERROR = 1;
/**状态:打开失败*/
public static final int STATUS_OPEN_ERROR = 2;
/**状态:解码成功*/
public static final int STATUS_FINISH = -1;
private InputStream in;
private int status;
public int width; // full image width
public int height; // full image height
private boolean gctFlag; // global color table used
private int gctSize; // size of global color table
private int loopCount = 1; // iterations; 0 = repeat forever
private int[] gct; // global color table
private int[] lct; // local color table
private int[] act; // active color table
private int bgIndex; // background color index
private int bgColor; // background color
private int lastBgColor; // previous bg color
private int pixelAspect; // pixel aspect ratio
private boolean lctFlag; // local color table flag
private boolean interlace; // interlace flag
private int lctSize; // local color table size
private int ix, iy, iw, ih; // current image rectangle
private int lrx, lry, lrw, lrh;
private Bitmap image; // current frame
private Bitmap lastImage; // previous frame
private GifFrame currentFrame = null;
private boolean isShow = false;
private byte[] block = new byte[256]; // current data block
private int blockSize = 0; // block size
// last graphic control extension info
private int dispose = 0;
// 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev
private int lastDispose = 0;
private boolean transparency = false; // use transparent color
private int delay = 0; // delay in milliseconds
private int transIndex; // transparent color index
private static final int MaxStackSize = 4096;
// max decoder pixel stack size
// LZW decoder working arrays
private short[] prefix;
private byte[] suffix;
private byte[] pixelStack;
private byte[] pixels;
private GifFrame gifFrame; // frames read from current file
private int frameCount;
private GifAction action = null;
private byte[] gifData = null;
public GifDecoder(byte[] data,GifAction act){
gifData = data;
action = act;
}
public GifDecoder(InputStream is,GifAction act){
in = is;
action = act;
}
public void run(){
if(in != null){
readStream();
}else if(gifData != null){
readByte();
}
}
/**
* 释放资源
*/
public void free(){
GifFrame fg = gifFrame;
while(fg != null){
fg.image = null;
fg = null;
gifFrame = gifFrame.nextFrame;
fg = gifFrame;
}
if(in != null){
try{
in.close();
}catch(Exception ex){}
in = null;
}
gifData = null;
}
/**
* 当前状态
* @return
*/
public int getStatus(){
return status;
}
/**
* 解码是否成功,成功返回true
* @return 成功返回true,否则返回false
*/
public boolean parseOk(){
return status == STATUS_FINISH;
}
/**
* 取某帧的延时时间
* @param n 第几帧
* @return 延时时间,毫秒
*/
public int getDelay(int n) {
delay = -1;
if ((n >= 0) && (n < frameCount)) {
// delay = ((GifFrame) frames.elementAt(n)).delay;
GifFrame f = getFrame(n);
if (f != null)
delay = f.delay;
}
return delay;
}
/**
* 取所有帧的延时时间
* @return
*/
public int[] getDelays(){
GifFrame f = gifFrame;
int[] d = new int[frameCount];
int i = 0;
while(f != null && i < frameCount){
d[i] = f.delay;
f = f.nextFrame;
i++;
}
return d;
}
/**
* 取总帧 数
* @return 图片的总帧数
*/
public int getFrameCount() {
return frameCount;
}
/**
* 取第一帧图片
* @return
*/
public Bitmap getImage() {
return getFrameImage(0);
}
public int getLoopCount() {
return loopCount;
}
private void setPixels() {
int[] dest = new int[width * height];
// fill in starting image contents based on last image's dispose code
if (lastDispose > 0) {
if (lastDispose == 3) {
// use image before last
int n = frameCount - 2;
if (n > 0) {
lastImage = getFrameImage(n - 1);
} else {
lastImage = null;
}
}
if (lastImage != null) {
lastImage.getPixels(dest, 0, width, 0, 0, width, height);
// copy pixels
if (lastDispose == 2) {
// fill last image rect area with background color
int c = 0;
if (!transparency) {
c = lastBgColor;
}
for (int i = 0; i < lrh; i++) {
int n1 = (lry + i) * width + lrx;
int n2 = n1 + lrw;
for (int k = n1; k < n2; k++) {
dest[k] = c;
}
}
}
}
}
// copy each source line to the appropriate place in the destination
int pass = 1;
int inc = 8;
int iline = 0;
for (int i = 0; i < ih; i++) {
int line = i;
if (interlace) {
if (iline >= ih) {
pass++;
switch (pass) {
case 2:
iline = 4;
break;
case 3:
iline = 2;
inc = 4;
break;
case 4:
iline = 1;
inc = 2;
}
}
line = iline;
iline += inc;
}
line += iy;
if (line < height) {
int k = line * width;
int dx = k + ix; // start of line in dest
int dlim = dx + iw; // end of dest line
if ((k + width) < dlim) {
dlim = k + width; // past dest edge
}
int sx = i * iw; // start of line in source
while (dx < dlim) {
// map color and insert in destination
int index = ((int) pixels[sx++]) & 0xff;
int c = act[index];
if (c != 0) {
dest[dx] = c;
}
dx++;
}
}
}
image = Bitmap.createBitmap(dest, width, height, Config.ARGB_4444);
}
/**
* 取第几帧的图片
* @param n 帧数
* @return 可画的图片,如果没有此帧或者出错,返回null
*/
public Bitmap getFrameImage(int n) {
GifFrame frame = getFrame(n);
if (frame == null)
return null;
else
return frame.image;
}
/**
* 取当前帧图片
* @return 当前帧可画的图片
*/
public GifFrame getCurrentFrame(){
return currentFrame;
}
/**
* 取第几帧,每帧包含了可画的图片和延时时间
* @param n 帧数
* @return
*/
public GifFrame getFrame(int n) {
GifFrame frame = gifFrame;
int i = 0;
while (frame != null) {
if (i == n) {
return frame;
} else {
frame = frame.nextFrame;
}
i++;
}
return null;
}
/**
* 重置,进行本操作后,会直接到第一帧
*/
public void reset(){
currentFrame = gifFrame;
}
/**
* 下一帧,进行本操作后,通过getCurrentFrame得到的是下一帧
* @return 返回下一帧
*/
public GifFrame next() {
if(isShow == false){
isShow = true;
return gifFrame;
}else{
if(status == STATUS_PARSING){
if(currentFrame.nextFrame != null)
currentFrame = currentFrame.nextFrame;
//currentFrame = gifFrame;
}else{
currentFrame = currentFrame.nextFrame;
if (currentFrame == null) {
currentFrame = gifFrame;
}
}
return currentFrame;
}
}
private int readByte(){
in = new ByteArrayInputStream(gifData);
gifData = null;
return readStream();
}
// public int read(byte[] data){
// InputStream is = new ByteArrayInputStream(data);
// return read(is);
// }
private int readStream(){
init();
if(in != null){
readHeader();
if(!err()){
readContents();
if(frameCount < 0){
status = STATUS_FORMAT_ERROR;
action.parseOk(false
没有合适的资源?快使用搜索试试~ 我知道了~
小程序源码 GifView.rar
共25个文件
class:11个
java:5个
xml:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 35 浏览量
2023-03-19
20:24:26
上传
评论
收藏 53KB RAR 举报
温馨提示
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。
资源推荐
资源详情
资源评论
收起资源包目录
小程序源码 GifView.rar (25个子文件)
GifView
.classpath 280B
assets
src
com
ant
liao
GifFrame.java 362B
GifView.java 9KB
GifAction.java 306B
GifDecoder.java 17KB
res
values
strings.xml 156B
layout
drawable
icon.png 3KB
bin
resources.ap_ 4KB
GifView.apk 15KB
classes.dex 18KB
com
ant
liao
GifDecoder.class 11KB
GifView.class 7KB
GifFrame.class 483B
GifView$GifImageType.class 1KB
R$string.class 409B
R$attr.class 322B
GifAction.class 138B
R$drawable.class 382B
GifView$1.class 624B
R.class 409B
GifView$DrawThread.class 1KB
default.properties 449B
.project 843B
AndroidManifest.xml 359B
gen
com
ant
liao
R.java 537B
共 25 条
- 1
资源评论
荣华富贵8
- 粉丝: 214
- 资源: 7653
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功