亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? animatedgifencoder.java

?? open java gif, it is a source.
?? JAVA
字號(hào):
package model.util;

import java.io.*;
import java.awt.*;
import java.awt.image.*;

/**
 * Class AnimatedGifEncoder - Encodes a GIF file consisting of one or
 * more frames.
 * <pre>
 * Example:
 *    AnimatedGifEncoder e = new AnimatedGifEncoder();
 *    e.start(outputFileName);
 *    e.setDelay(1000);   // 1 frame per sec
 *    e.addFrame(image1);
 *    e.addFrame(image2);
 *    e.finish();
 * </pre>
 * No copyright asserted on the source code of this class.  May be used
 * for any purpose, however, refer to the Unisys LZW patent for restrictions
 * on use of the associated LZWEncoder class.  Please forward any corrections
 * to kweiner@fmsware.com.
 *
 * @author Kevin Weiner, FM Software
 * @version 1.03 November 2003
 *
 */

public class AnimatedGifEncoder {

	protected int width; // image size
	protected int height;
	protected Color transparent = null; // transparent color if given
	protected int transIndex; // transparent index in color table
	protected int repeat = -1; // no repeat
	protected int delay = 0; // frame delay (hundredths)
	protected boolean started = false; // ready to output frames
	protected OutputStream out;
	protected BufferedImage image; // current frame
	protected byte[] pixels; // BGR byte array from frame
	protected byte[] indexedPixels; // converted frame indexed to palette
	protected int colorDepth; // number of bit planes
	protected byte[] colorTab; // RGB palette
	protected boolean[] usedEntry = new boolean[256]; // active palette entries
	protected int palSize = 7; // color table size (bits-1)
	protected int dispose = -1; // disposal code (-1 = use default)
	protected boolean closeStream = false; // close stream when finished
	protected boolean firstFrame = true;
	protected boolean sizeSet = false; // if false, get size from first frame
	protected int sample = 10; // default sample interval for quantizer

	/**
	 * Sets the delay time between each frame, or changes it
	 * for subsequent frames (applies to last frame added).
	 *
	 * @param ms int delay time in milliseconds
	 */
	public void setDelay(int ms) {
		delay = Math.round(ms / 10.0f);
	}
	
	/**
	 * Sets the GIF frame disposal code for the last added frame
	 * and any subsequent frames.  Default is 0 if no transparent
	 * color has been set, otherwise 2.
	 * @param code int disposal code.
	 */
	public void setDispose(int code) {
		if (code >= 0) {
			dispose = code;
		}
	}
	
	/**
	 * Sets the number of times the set of GIF frames
	 * should be played.  Default is 1; 0 means play
	 * indefinitely.  Must be invoked before the first
	 * image is added.
	 *
	 * @param iter int number of iterations.
	 * @return
	 */
	public void setRepeat(int iter) {
		if (iter >= 0) {
			repeat = iter;
		}
	}
	
	/**
	 * Sets the transparent color for the last added frame
	 * and any subsequent frames.
	 * Since all colors are subject to modification
	 * in the quantization process, the color in the final
	 * palette for each frame closest to the given color
	 * becomes the transparent color for that frame.
	 * May be set to null to indicate no transparent color.
	 *
	 * @param c Color to be treated as transparent on display.
	 */
	public void setTransparent(Color c) {
		transparent = c;
	}
	
	/**
	 * Adds next GIF frame.  The frame is not written immediately, but is
	 * actually deferred until the next frame is received so that timing
	 * data can be inserted.  Invoking <code>finish()</code> flushes all
	 * frames.  If <code>setSize</code> was not invoked, the size of the
	 * first image is used for all subsequent frames.
	 *
	 * @param im BufferedImage containing frame to write.
	 * @return true if successful.
	 */
	public boolean addFrame(BufferedImage im) {
		if ((im == null) || !started) {
			return false;
		}
		boolean ok = true;
		try {
			if (!sizeSet) {
				// use first frame's size
				setSize(im.getWidth(), im.getHeight());
			}
			image = im;
			getImagePixels(); // convert to correct format if necessary
			analyzePixels(); // build color table & map pixels
			if (firstFrame) {
				writeLSD(); // logical screen descriptior
				writePalette(); // global color table
				if (repeat >= 0) {
					// use NS app extension to indicate reps
					writeNetscapeExt();
				}
			}
			writeGraphicCtrlExt(); // write graphic control extension
			writeImageDesc(); // image descriptor
			if (!firstFrame) {
				writePalette(); // local color table
			}
			writePixels(); // encode and write pixel data
			firstFrame = false;
		} catch (IOException e) {
			ok = false;
		}

		return ok;
	}
	
	/**
	 * Flushes any pending data and closes output file.
	 * If writing to an OutputStream, the stream is not
	 * closed.
	 */
	public boolean finish() {
		if (!started) return false;
		boolean ok = true;
		started = false;
		try {
			out.write(0x3b); // gif trailer
			out.flush();
			if (closeStream) {
				out.close();
			}
		} catch (IOException e) {
			ok = false;
		}

		// reset for subsequent use
		transIndex = 0;
		out = null;
		image = null;
		pixels = null;
		indexedPixels = null;
		colorTab = null;
		closeStream = false;
		firstFrame = true;

		return ok;
	}
	
	/**
	 * Sets frame rate in frames per second.  Equivalent to
	 * <code>setDelay(1000/fps)</code>.
	 *
	 * @param fps float frame rate (frames per second)
	 */
	public void setFrameRate(float fps) {
		if (fps != 0f) {
			delay = Math.round(100f / fps);
		}
	}
	
	/**
	 * Sets quality of color quantization (conversion of images
	 * to the maximum 256 colors allowed by the GIF specification).
	 * Lower values (minimum = 1) produce better colors, but slow
	 * processing significantly.  10 is the default, and produces
	 * good color mapping at reasonable speeds.  Values greater
	 * than 20 do not yield significant improvements in speed.
	 *
	 * @param quality int greater than 0.
	 * @return
	 */
	public void setQuality(int quality) {
		if (quality < 1) quality = 1;
		sample = quality;
	}
	
	/**
	 * Sets the GIF frame size.  The default size is the
	 * size of the first frame added if this method is
	 * not invoked.
	 *
	 * @param w int frame width.
	 * @param h int frame width.
	 */
	public void setSize(int w, int h) {
		if (started && !firstFrame) return;
		width = w;
		height = h;
		if (width < 1) width = 320;
		if (height < 1) height = 240;
		sizeSet = true;
	}
	
	/**
	 * Initiates GIF file creation on the given stream.  The stream
	 * is not closed automatically.
	 *
	 * @param os OutputStream on which GIF images are written.
	 * @return false if initial write failed.
	 */
	public boolean start(OutputStream os) {
		if (os == null) return false;
		boolean ok = true;
		closeStream = false;
		out = os;
		try {
			writeString("GIF89a"); // header
		} catch (IOException e) {
			ok = false;
		}
		return started = ok;
	}
	
	/**
	 * Initiates writing of a GIF file with the specified name.
	 *
	 * @param file String containing output file name.
	 * @return false if open or initial write failed.
	 */
	public boolean start(String file) {
		boolean ok = true;
		try {
			out = new BufferedOutputStream(new FileOutputStream(file));
			ok = start(out);
			closeStream = true;
		} catch (IOException e) {
			ok = false;
		}
		return started = ok;
	}
	
	/**
	 * Analyzes image colors and creates color map.
	 */
	protected void analyzePixels() {
		int len = pixels.length;
		int nPix = len / 3;
		indexedPixels = new byte[nPix];
		NeuQuant nq = new NeuQuant(pixels, len, sample);
		// initialize quantizer
		colorTab = nq.process(); // create reduced palette
		// convert map from BGR to RGB
		for (int i = 0; i < colorTab.length; i += 3) {
			byte temp = colorTab[i];
			colorTab[i] = colorTab[i + 2];
			colorTab[i + 2] = temp;
			usedEntry[i / 3] = false;
		}
		// map image pixels to new palette
		int k = 0;
		for (int i = 0; i < nPix; i++) {
			int index =
				nq.map(pixels[k++] & 0xff,
					   pixels[k++] & 0xff,
					   pixels[k++] & 0xff);
			usedEntry[index] = true;
			indexedPixels[i] = (byte) index;
		}
		pixels = null;
		colorDepth = 8;
		palSize = 7;
		// get closest match to transparent color if specified
		if (transparent != null) {
			transIndex = findClosest(transparent);
		}
	}
	
	/**
	 * Returns index of palette color closest to c
	 *
	 */
	protected int findClosest(Color c) {
		if (colorTab == null) return -1;
		int r = c.getRed();
		int g = c.getGreen();
		int b = c.getBlue();
		int minpos = 0;
		int dmin = 256 * 256 * 256;
		int len = colorTab.length;
		for (int i = 0; i < len;) {
			int dr = r - (colorTab[i++] & 0xff);
			int dg = g - (colorTab[i++] & 0xff);
			int db = b - (colorTab[i] & 0xff);
			int d = dr * dr + dg * dg + db * db;
			int index = i / 3;
			if (usedEntry[index] && (d < dmin)) {
				dmin = d;
				minpos = index;
			}
			i++;
		}
		return minpos;
	}
	
	/**
	 * Extracts image pixels into byte array "pixels"
	 */
	protected void getImagePixels() {
		int w = image.getWidth();
		int h = image.getHeight();
		int type = image.getType();
		if ((w != width)
			|| (h != height)
			|| (type != BufferedImage.TYPE_3BYTE_BGR)) {
			// create new image with right size/format
			BufferedImage temp =
				new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
			Graphics2D g = temp.createGraphics();
			g.drawImage(image, 0, 0, null);
			image = temp;
		}
		pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
	}
	
	/**
	 * Writes Graphic Control Extension
	 */
	protected void writeGraphicCtrlExt() throws IOException {
		out.write(0x21); // extension introducer
		out.write(0xf9); // GCE label
		out.write(4); // data block size
		int transp, disp;
		if (transparent == null) {
			transp = 0;
			disp = 0; // dispose = no action
		} else {
			transp = 1;
			disp = 2; // force clear if using transparent color
		}
		if (dispose >= 0) {
			disp = dispose & 7; // user override
		}
		disp <<= 2;

		// packed fields
		out.write(0 | // 1:3 reserved
			   disp | // 4:6 disposal
			      0 | // 7   user input - 0 = none
		     transp); // 8   transparency flag

		writeShort(delay); // delay x 1/100 sec
		out.write(transIndex); // transparent color index
		out.write(0); // block terminator
	}
	
	/**
	 * Writes Image Descriptor
	 */
	protected void writeImageDesc() throws IOException {
		out.write(0x2c); // image separator
		writeShort(0); // image position x,y = 0,0
		writeShort(0);
		writeShort(width); // image size
		writeShort(height);
		// packed fields
		if (firstFrame) {
			// no LCT  - GCT is used for first (or only) frame
			out.write(0);
		} else {
			// specify normal LCT
			out.write(0x80 | // 1 local color table  1=yes
						 0 | // 2 interlace - 0=no
						 0 | // 3 sorted - 0=no
						 0 | // 4-5 reserved
				   palSize); // 6-8 size of color table
		}
	}
	
	/**
	 * Writes Logical Screen Descriptor
	 */
	protected void writeLSD() throws IOException {
		// logical screen size
		writeShort(width);
		writeShort(height);
		// packed fields
		out.write((0x80 | // 1   : global color table flag = 1 (gct used)
				   0x70 | // 2-4 : color resolution = 7
				   0x00 | // 5   : gct sort flag = 0
			   palSize)); // 6-8 : gct size

		out.write(0); // background color index
		out.write(0); // pixel aspect ratio - assume 1:1
	}
	
	/**
	 * Writes Netscape application extension to define
	 * repeat count.
	 */
	protected void writeNetscapeExt() throws IOException {
		out.write(0x21); // extension introducer
		out.write(0xff); // app extension label
		out.write(11); // block size
		writeString("NETSCAPE" + "2.0"); // app id + auth code
		out.write(3); // sub-block size
		out.write(1); // loop sub-block id
		writeShort(repeat); // loop count (extra iterations, 0=repeat forever)
		out.write(0); // block terminator
	}
	
	/**
	 * Writes color table
	 */
	protected void writePalette() throws IOException {
		out.write(colorTab, 0, colorTab.length);
		int n = (3 * 256) - colorTab.length;
		for (int i = 0; i < n; i++) {
			out.write(0);
		}
	}
	
	/**
	 * Encodes and writes pixel data
	 */
	protected void writePixels() throws IOException {
		LZWEncoder encoder =
			new LZWEncoder(width, height, indexedPixels, colorDepth);
		encoder.encode(out);
	}
	
	/**
	 *    Write 16-bit value to output stream, LSB first
	 */
	protected void writeShort(int value) throws IOException {
		out.write(value & 0xff);
		out.write((value >> 8) & 0xff);
	}
	
	/**
	 * Writes string to output stream
	 */
	protected void writeString(String s) throws IOException {
		for (int i = 0; i < s.length(); i++) {
			out.write((byte) s.charAt(i));
		}
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区中文在线| 黄色日韩三级电影| 久久影视一区二区| 欧美性大战久久久久久久蜜臀 | 9191国产精品| 国产1区2区3区精品美女| 亚洲6080在线| 亚洲女厕所小便bbb| 久久久久久久久免费| 欧美日韩国产影片| 91久久免费观看| 丁香啪啪综合成人亚洲小说| 久热成人在线视频| 午夜精品久久久久影视| 亚洲免费成人av| 国产欧美日韩在线| 精品sm在线观看| 欧美岛国在线观看| 91精品国产综合久久久久久漫画 | 欧美精品一区在线观看| 欧美午夜电影网| 99精品视频一区| 不卡影院免费观看| 国产69精品一区二区亚洲孕妇| 麻豆成人免费电影| 丝袜美腿一区二区三区| 亚洲第一福利一区| 一区二区三区四区激情| 成人免费在线播放视频| 中文成人综合网| 日本一区二区三级电影在线观看 | 一区二区三区四区激情| 亚洲色图另类专区| 亚洲色图都市小说| 一区二区三区四区在线| 亚洲精品乱码久久久久久| 亚洲欧美另类图片小说| 亚洲免费观看高清完整版在线观看 | 亚洲风情在线资源站| 亚洲裸体xxx| 一区二区三区电影在线播| 亚洲欧洲精品一区二区三区不卡| 国产精品美女久久久久aⅴ| 久久综合九色综合欧美就去吻| 久久综合色婷婷| 国产精品视频免费| 亚洲精品免费在线播放| 亚洲资源中文字幕| 日韩二区三区四区| 久久国产成人午夜av影院| 国产乱色国产精品免费视频| 国产乱码一区二区三区| 成人性视频网站| 99精品视频在线观看免费| 一本到不卡免费一区二区| 欧美日韩国产在线播放网站| 欧美一区二区三区日韩视频| 精品久久久久久最新网址| 久久久国产一区二区三区四区小说 | 亚洲国产精品久久人人爱蜜臀| 午夜精彩视频在线观看不卡| 奇米色一区二区| 国产成人精品免费在线| 99国产一区二区三精品乱码| 欧美综合在线视频| 日韩一区二区电影| 久久久久国产精品人| 国产精品久久久久aaaa| 亚洲国产欧美日韩另类综合| 麻豆精品一区二区综合av| 国产激情视频一区二区在线观看 | 日韩欧美国产电影| 国产精品色呦呦| 亚洲第一精品在线| 国产精品1024| 欧美日韩一卡二卡三卡| 久久综合久久久久88| 怡红院av一区二区三区| 看电视剧不卡顿的网站| 不卡视频免费播放| 欧美一级理论性理论a| 欧美激情一二三区| 香蕉久久夜色精品国产使用方法| 国产精一区二区三区| 欧美亚洲国产bt| 久久婷婷成人综合色| 亚洲一区在线视频观看| 懂色av一区二区在线播放| 欧美少妇一区二区| 欧美激情一区在线观看| 青草国产精品久久久久久| www.亚洲人| 欧美成人a∨高清免费观看| 亚洲日穴在线视频| 国产在线精品一区二区不卡了 | 91在线观看污| 日韩视频国产视频| 亚洲码国产岛国毛片在线| 国产麻豆欧美日韩一区| 欧美日韩1区2区| 中文字幕一区二区三区精华液 | 色域天天综合网| 国产日产欧产精品推荐色| 秋霞av亚洲一区二区三| 色综合色狠狠天天综合色| 久久毛片高清国产| 日韩电影网1区2区| 色婷婷综合久色| 日本一区二区成人在线| 激情五月婷婷综合网| 欧美久久久久免费| 依依成人精品视频| 99精品视频在线观看| 国产日产欧美精品一区二区三区| 久久国产剧场电影| 555夜色666亚洲国产免| 亚洲午夜精品久久久久久久久| 色综合色综合色综合色综合色综合 | 大尺度一区二区| 精品噜噜噜噜久久久久久久久试看| 亚洲va韩国va欧美va| 日本精品免费观看高清观看| 国产精品国产三级国产| 成人自拍视频在线观看| 久久久久久免费| 国产麻豆精品久久一二三| 日韩精品在线看片z| 免费观看成人鲁鲁鲁鲁鲁视频| 在线播放日韩导航| 午夜精品一区二区三区电影天堂| 在线观看91视频| 亚洲成a人片在线观看中文| 欧美亚洲愉拍一区二区| 亚洲国产婷婷综合在线精品| 在线观看不卡一区| 五月综合激情网| 91精品国产色综合久久不卡电影 | 91在线一区二区| 自拍偷拍欧美精品| 色综合久久中文字幕| 一区二区三区日韩| 欧美日韩在线播放三区| 日韩国产在线观看| 这里是久久伊人| 久久精品国产**网站演员| 精品少妇一区二区三区免费观看| 另类小说图片综合网| 久久久久亚洲蜜桃| hitomi一区二区三区精品| 亚洲欧美日韩在线不卡| 欧美日韩免费一区二区三区| 日日摸夜夜添夜夜添国产精品| 欧美一区二区三区男人的天堂| 久久成人18免费观看| 国产女人aaa级久久久级| 99久久综合色| 午夜av一区二区| 亚洲精品一区二区三区影院| kk眼镜猥琐国模调教系列一区二区 | 欧美午夜影院一区| 日本va欧美va精品发布| 国产色91在线| 91视频在线看| 天天亚洲美女在线视频| 久久免费国产精品| 在线看国产日韩| 男女视频一区二区| 国产精品网站一区| 欧美另类一区二区三区| 国产精品一线二线三线| 亚洲精品日产精品乱码不卡| 欧美一区二区三区不卡| 国产91丝袜在线播放0| 亚洲主播在线播放| 2023国产一二三区日本精品2022| proumb性欧美在线观看| 三级不卡在线观看| 国产精品午夜免费| 在线成人午夜影院| 成人aaaa免费全部观看| 日韩和欧美的一区| 国产精品伦理在线| 日韩一卡二卡三卡国产欧美| av电影一区二区| 男人的j进女人的j一区| 日韩毛片视频在线看| 欧美精品一区男女天堂| 在线观看免费视频综合| 风间由美性色一区二区三区| 亚洲二区在线视频| 国产精品久线观看视频| 91精品免费观看| 91免费观看视频在线| 黄色日韩网站视频| 日韩精品亚洲一区| 亚洲精品综合在线| 中文子幕无线码一区tr| 日韩精品一区二区三区视频播放| 91久久国产最好的精华液| 国产不卡视频一区二区三区|