⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 giffileformat.java

📁 源码为Eclipse开源开发平台桌面开发工具SWT的源代码,
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			userInput = (bitField & 0x02) != 0;			// Store the disposal method.			disposalMethod = (bitField >> 2) & 0x07;			// Store the delay time.			delayTime = (controlBlock[1] & 0xFF) | ((controlBlock[2] & 0xFF) << 8);			// Store the transparent color.			if ((bitField & 0x01) != 0) {				int colorIndex = controlBlock[3] & 0xFF;				/* Work around: a customer has a GIF that specifies an				 * invalid color index that is larger than the number				 * of entries in the palette. Detect this case, and				 * ignore the specified color index. */				if (colorIndex <= 1 << defaultDepth) {					transparentPixel = colorIndex;				}			} else {				transparentPixel = -1;			}			// Read block terminator.			inputStream.read();			return controlBlock;		} catch (Exception e) {			SWT.error(SWT.ERROR_IO, e);			return null;		}	}	/**	 * We have just read the Application extension identifier	 * from the input stream.  Read in the rest of the extension,	 * look for and store 'number of repeats', and return the data.	 */	byte[] readApplicationExtension() {		try {			// Read size of block = 0x0B.			inputStream.read();			// Read application identifier.			byte[] applicationBytes = new byte[8];			inputStream.read(applicationBytes);			String application = new String(applicationBytes);			// Read authentication code.			byte[] authenticationBytes = new byte[3];			inputStream.read(authenticationBytes);			String authentication = new String(authenticationBytes);			// Read application data.			byte[] data = new byte[0];			byte[] block = new byte[255];			int size = inputStream.read();			while ((size > 0) && (inputStream.read(block, 0, size) != -1)) {				byte[] oldData = data;				data = new byte[oldData.length + size];				System.arraycopy(oldData, 0, data, 0, oldData.length);				System.arraycopy(block, 0, data, oldData.length, size);				size = inputStream.read();			}			// Look for the NETSCAPE 'repeat count' field for an animated GIF.			if (application.equals("NETSCAPE") && authentication.equals("2.0") && data[0] == 01) { //$NON-NLS-1$ //$NON-NLS-2$				repeatCount = (data[1] & 0xFF) | ((data[2] & 0xFF) << 8);				loader.repeatCount = repeatCount;			}			return data;		} catch (Exception e) {			SWT.error(SWT.ERROR_IO, e);			return null;		}	}	/**	 * Return a DeviceIndependentImage representing the	 * image block at the current position in the input stream.	 * Throw an error if an error occurs.	 */	ImageData readImageBlock(PaletteData defaultPalette) {		int depth;		PaletteData palette;		byte[] block = new byte[9];		try {			inputStream.read(block);		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}		int left = (block[0] & 0xFF) | ((block[1] & 0xFF) << 8);		int top = (block[2] & 0xFF) | ((block[3] & 0xFF) << 8);		int width = (block[4] & 0xFF) | ((block[5] & 0xFF) << 8);		int height = (block[6] & 0xFF) | ((block[7] & 0xFF) << 8);		byte bitField = block[8];		boolean interlaced = (bitField & 0x40) != 0;//		boolean sorted = (bitField & 0x20) != 0;		if ((bitField & 0x80) != 0) {			// Local palette.			depth = (bitField & 0x7) + 1;			palette = readPalette(1 << depth);		} else {			// No local palette.			depth = defaultDepth;			palette = defaultPalette;		}		// Promote depth to next highest supported value.		if (!(depth == 1 || depth == 4 || depth == 8)) {			if (depth < 4)				depth = 4;			else				depth = 8;		}		if (palette == null) {			palette = grayRamp(1 << depth);		}		int initialCodeSize = -1;		try {			initialCodeSize = inputStream.read();		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}		if (initialCodeSize < 0) {			SWT.error(SWT.ERROR_INVALID_IMAGE);		}		ImageData image = ImageData.internal_new(			width,			height,			depth,			palette,			4,			null,			0,			null,			null,			-1,			transparentPixel,			SWT.IMAGE_GIF,			left,			top,			disposalMethod,			delayTime);			LZWCodec codec = new LZWCodec();		codec.decode(inputStream, loader, image, interlaced, initialCodeSize);		return image;	}	/**	 * Read a palette from the input stream.	 */	PaletteData readPalette(int numColors) {		byte[] bytes = new byte[numColors * 3];		try {			if (inputStream.read(bytes) != bytes.length)				SWT.error(SWT.ERROR_INVALID_IMAGE);		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}		RGB[] colors = new RGB[numColors];		for (int i = 0; i < numColors; i++)			colors[i] = new RGB(bytes[i*3] & 0xFF, 				bytes[i*3+1] & 0xFF, bytes[i*3+2] & 0xFF);		return new PaletteData(colors);	}	/**	 * Write the specified device independent image	 * to the output stream.	 */	void unloadIntoByteStream(ImageData image) {		if (!((image.depth == 1) || (image.depth == 4) || (image.depth == 8))) {			SWT.error(SWT.ERROR_UNSUPPORTED_DEPTH);		}		byte bitField = (byte)((0x80 & 0xF8 & 0xF7 & 0x8F) + (image.depth - 1) + ((image.depth - 1) * 16));		try {			outputStream.write(new byte[] { (byte)'G', (byte)'I', (byte)'F' });			outputStream.write(new byte[] { (byte)'8', (byte)'9', (byte)'a' });			outputStream.writeShort((short)image.width);			outputStream.writeShort((short)image.height);			outputStream.writeByte(bitField);			outputStream.writeByte((byte)0);			outputStream.writeByte((byte)0);		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}		writePalette(image.palette, image.depth);		if (image.transparentPixel != -1 || image.disposalMethod != 0 || image.delayTime != 0) {			writeGraphicsControlBlock(image);		}		writeImageBlock(image);		try {			outputStream.write(0x3B);		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}	}	/**	 * Write out a GraphicsControlBlock to describe	 * the specified device independent image.	 */	void writeGraphicsControlBlock(ImageData image) {		try {			outputStream.write(GIF_EXTENSION_BLOCK_ID);			outputStream.write(GIF_GRAPHICS_CONTROL_BLOCK_ID);			outputStream.write(0x04); // size of block			byte[] gcBlock = new byte[4];			gcBlock[0] = (byte)0xFD;			gcBlock[1] = 0;			gcBlock[2] = 0;			gcBlock[3] = 0;			if (image.transparentPixel == -1) {				gcBlock[0] = (byte)(gcBlock[0] & 0xFE);			} else {				gcBlock[0] = (byte)(gcBlock[0] | 0x01);				gcBlock[3] = (byte)image.transparentPixel;			}			if (image.disposalMethod != 0) {				gcBlock[0] = (byte)(gcBlock[0] | ((image.disposalMethod & 0x07) << 2));			}			if (image.delayTime != 0) {				gcBlock[1] = (byte)(image.delayTime & 0xFF);				gcBlock[2] = (byte)((image.delayTime >> 8) & 0xFF);			}			outputStream.write(gcBlock);			outputStream.write(0); // block terminator		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}	}	/**	 * Write the specified device independent image	 * to the current position in the output stream.	 */	void writeImageBlock(ImageData image) {		try {			outputStream.write(GIF_IMAGE_BLOCK_ID);			byte[] block = new byte[9];			block[0] = (byte)(image.x & 0xFF);			block[1] = (byte)((image.x >> 8) & 0xFF);			block[2] = (byte)(image.y & 0xFF);			block[3] = (byte)((image.y >> 8) & 0xFF);			block[4] = (byte)(image.width & 0xFF);			block[5] = (byte)((image.width >> 8) & 0xFF);			block[6] = (byte)(image.height & 0xFF);			block[7] = (byte)((image.height >> 8) & 0xFF); 			block[8] = 0; // no interlace, no sort, no local palette			outputStream.write(block);			outputStream.write(image.depth);		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}		new LZWCodec().encode(outputStream, image);	}	/**	 * Write the specified palette to the output stream.	 */	void writePalette(PaletteData palette, int depth) {		byte[] bytes = new byte[(1 << depth) * 3];		int offset = 0;		for (int i = 0; i < palette.colors.length; i++) {			RGB color = palette.colors[i];			bytes[offset] = (byte)color.red;			bytes[offset + 1] = (byte)color.green;			bytes[offset + 2] = (byte)color.blue;			offset += 3;		}		try {			outputStream.write(bytes);		} catch (IOException e) {			SWT.error(SWT.ERROR_IO, e);		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -