package net.loyin.util.vcode;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
/**
* <p></p>
*
* @author: wuhongjun
* @version:1.0
*/
public class GifDecoder
{
/**
* File read status: No errors.
*/
public static final int STATUS_OK = 0;
/**
* File read status: Error decoding file (may be partially decoded)
*/
public static final int STATUS_FORMAT_ERROR = 1;
/**
* File read status: Unable to open source.
*/
public static final int STATUS_OPEN_ERROR = 2;
protected BufferedInputStream in;
protected int status;
protected int width; // full image width
protected int height; // full image height
protected boolean gctFlag; // global color table used
protected int gctSize; // size of global color table
protected int loopCount = 1; // iterations; 0 = repeat forever
protected int[] gct; // global color table
protected int[] lct; // local color table
protected int[] act; // active color table
protected int bgIndex; // background color index
protected int bgColor; // background color
protected int lastBgColor; // previous bg color
protected int pixelAspect; // pixel aspect ratio
protected boolean lctFlag; // local color table flag
protected boolean interlace; // interlace flag
protected int lctSize; // local color table size
protected int ix, iy, iw, ih; // current image rectangle
protected Rectangle lastRect; // last image rect
protected BufferedImage image; // current frame
protected BufferedImage lastImage; // previous frame
protected byte[] block = new byte[256]; // current data block
protected int blockSize = 0; // block size
// last graphic control extension info
protected int dispose = 0;
// 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev
protected int lastDispose = 0;
protected boolean transparency = false; // use transparent color
protected int delay = 0; // delay in milliseconds
protected int transIndex; // transparent color index
protected static final int MaxStackSize = 4096;
// max decoder pixel stack size
// LZW decoder working arrays
protected short[] prefix;
protected byte[] suffix;
protected byte[] pixelStack;
protected byte[] pixels;
protected ArrayList<GifFrame> frames; // frames read from current file
protected int frameCount;
static class GifFrame {
public GifFrame(BufferedImage im, int del) {
image = im;
delay = del;
}
public BufferedImage image;
public int delay;
}
/**
* Gets display duration for specified frame.
*
* @param n int index of frame
* @return delay in milliseconds
*/
public int getDelay(int n) {
//
delay = -1;
if ((n >= 0) && (n < frameCount)) {
delay = (frames.get(n)).delay;
}
return delay;
}
/**
* Gets the number of frames read from file.
* @return frame count
*/
public int getFrameCount() {
return frameCount;
}
/**
* Gets the first (or only) image read.
*
* @return BufferedImage containing first frame, or null if none.
*/
public BufferedImage getImage() {
return getFrame(0);
}
/**
* Gets the "Netscape" iteration count, if any.
* A count of 0 means repeat indefinitiely.
*
* @return iteration count if one was specified, else 1.
*/
public int getLoopCount() {
return loopCount;
}
/**
* Creates new frame image from current data (and previous
* frames as specified by their disposition codes).
*/
protected void setPixels() {
// expose destination image's pixels as int array
int[] dest = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
// 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 = getFrame(n - 1);
} else {
lastImage = null;
}
}
if (lastImage != null) {
int[] prev =
((DataBufferInt) lastImage.getRaster().getDataBuffer()).getData();
System.arraycopy(prev, 0, dest, 0, width * height);
// copy pixels
if (lastDispose == 2) {
// fill last image rect area with background color
Graphics2D g = image.createGraphics();
Color c = null;
if (transparency) {
c = new Color(0, 0, 0, 0); // assume background is transparent
} else {
c = new Color(lastBgColor); // use given background color
}
g.setColor(c);
g.setComposite(AlphaComposite.Src); // replace area
g.fill(lastRect);
g.dispose();
}
}
}
// 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++;
}
}
}
}
/**
* Gets the image contents of frame n.
*
* @return BufferedImage representation of frame, or null if n is invalid.
*/
public BufferedImage getFrame(int n) {
BufferedImage im = null;
if ((n >= 0) && (n < frameCount)) {
im = (frames.get(n)).image;
}
return im;
}
/**
* Gets image size.
*
* @return GIF image dimensions
*/
public Dimension getFrameSize() {
return new Dimension(width, height);
}
/**
* Reads GIF image from stream
*
* @param is BufferedInputStream containing GIF file.
* @return read status code (0 = no errors)
*/
public int read(BufferedInputStream is) {
init();
try{
if (is != null) {
in = is;
readHeader();
if (!err()) {
readContents();
if (frameCount < 0) {
status = STAT
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
完整的进销存整合财务系统 (1368个子文件)
cx050027_.backup 367KB
Order.class 20KB
Customer.class 20KB
CustomerCtrl.class 16KB
OrderCtrl.class 15KB
StorageBill.class 15KB
FileController.class 14KB
PayReceivAbles.class 13KB
Lunar.class 13KB
ReciveMail.class 12KB
StockAllot.class 12KB
AdminBaseController.class 11KB
UserCtrl.class 11KB
GifDecoder.class 11KB
StockCheck.class 11KB
HttpKit.class 11KB
PayReceivOrder.class 11KB
WeChat.class 9KB
TimeUtil.class 9KB
ValidateUtils.class 9KB
SnakerHelper.class 9KB
User.class 9KB
Stock.class 9KB
InMessage.class 8KB
StorageBillCtrl.class 8KB
Business.class 8KB
StockAllotCtrl.class 8KB
StockCheckCtrl.class 8KB
GifEncoder.class 8KB
MD5.class 8KB
PayReceivAblesCtrl.class 7KB
Leads.class 7KB
ExcelKit.class 7KB
MonitorServiceImpl.class 7KB
UploadTools.class 7KB
Quant.class 7KB
ParameCtrl.class 6KB
SaleGoal.class 6KB
Message.class 6KB
PayReceivOrderCtrl.class 6KB
ConcatRecord.class 6KB
PluginManager.class 6KB
AccountCtrl.class 6KB
CustMemorialday.class 6KB
Campaigns.class 6KB
CustCare.class 6KB
BaseController.class 6KB
Pay.class 6KB
AddWatermark.class 6KB
BusinessCtrl.class 6KB
MoneyUtil.class 6KB
ProductPriceOrder.class 6KB
ProductPriceOrderCtrl.class 6KB
Status.class 6KB
Contacts.class 6KB
ErrorCode.class 6KB
ResizeImage.class 6KB
TextUtil.class 6KB
ProcessCtrl.class 6KB
JFWebConfig.class 5KB
UploadFilter.class 5KB
Position.class 5KB
QuartzPlugin.class 5KB
ConfigKit.class 5KB
StockCtrl.class 5KB
SHA1.class 5KB
ClassSearcher.class 5KB
I18N.class 5KB
AbstractSequenceService.class 5KB
LeadsCtrl.class 5KB
PositionCtrl.class 5KB
IdGenerater.class 5KB
ZoomImage.class 5KB
Invoice.class 5KB
Parame.class 5KB
ValidCodeCtrl.class 5KB
WindowsSequenceService.class 5KB
OperateLogInterceptor.class 4KB
SubjectCtrl.class 4KB
IndexCtrl.class 4KB
Competitor.class 4KB
ProductCtrl.class 4KB
Product.class 4KB
SaleGoalCtrl.class 4KB
Base64Decoder.class 4KB
ValidateCode.class 4KB
Account.class 4KB
Encoder.class 4KB
TextImageUtil.class 4KB
ContactsCtrl.class 4KB
SimpleMailSender.class 4KB
PermissionInterceptor.class 4KB
InvoiceCtrl.class 4KB
CompanyCtrl.class 4KB
SnCreater.class 4KB
ConcatRecordCtrl.class 4KB
CustMemorialdayCtrl.class 4KB
T1.class 4KB
MailSenderInfo.class 4KB
AccountDetail.class 4KB
共 1368 条
- 1
- 2
- 3
- 4
- 5
- 6
- 14
资源评论
xiaochunkai204
- 粉丝: 2
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功