📄 giffileformat.java
字号:
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 + -