private static void SetImageBlock(byte[] gifBytes, ref int byteIndex, ref GifData gifData) { ImageBlock ib = new ImageBlock(); // Image Separator(1 Byte) // 0x2c ib.m_imageSeparator = gifBytes[byteIndex]; byteIndex++; // Image Left Position(2 Bytes) ib.m_imageLeftPosition = BitConverter.ToUInt16(gifBytes, byteIndex); byteIndex += 2; // Image Top Position(2 Bytes) ib.m_imageTopPosition = BitConverter.ToUInt16(gifBytes, byteIndex); byteIndex += 2; // Image Width(2 Bytes) ib.m_imageWidth = BitConverter.ToUInt16(gifBytes, byteIndex); byteIndex += 2; // Image Height(2 Bytes) ib.m_imageHeight = BitConverter.ToUInt16(gifBytes, byteIndex); byteIndex += 2; // 1 Byte { // Local Color Table Flag(1 Bit) ib.m_localColorTableFlag = (gifBytes[byteIndex] & 128) == 128; // 0b10000000 // Interlace Flag(1 Bit) ib.m_interlaceFlag = (gifBytes[byteIndex] & 64) == 64; // 0b01000000 // Sort Flag(1 Bit) ib.m_sortFlag = (gifBytes[byteIndex] & 32) == 32; // 0b00100000 // Reserved(2 Bits) // Unused // Size of Local Color Table(3 Bits) int val = (gifBytes[byteIndex] & 7) + 1; ib.m_sizeOfLocalColorTable = (int)Math.Pow(2, val); byteIndex++; } if (ib.m_localColorTableFlag) { // Local Color Table(0~255×3 Bytes) ib.m_localColorTable = new List <byte[]>(); for (int i = byteIndex; i < byteIndex + (ib.m_sizeOfLocalColorTable * 3); i += 3) { ib.m_localColorTable.Add(new byte[] { gifBytes[i], gifBytes[i + 1], gifBytes[i + 2] }); } byteIndex = byteIndex + (ib.m_sizeOfLocalColorTable * 3); } // LZW Minimum Code Size(1 Byte) ib.m_lzwMinimumCodeSize = gifBytes[byteIndex]; byteIndex++; // Block Size & Image Data List while (true) { // Block Size(1 Byte) byte blockSize = gifBytes[byteIndex]; byteIndex++; if (blockSize == 0x00) { // Block Terminator(1 Byte) break; } var imageDataBlock = new ImageBlock.ImageDataBlock(); imageDataBlock.m_blockSize = blockSize; // Image Data(? Bytes) imageDataBlock.m_imageData = new byte[imageDataBlock.m_blockSize]; for (int i = 0; i < imageDataBlock.m_imageData.Length; i++) { imageDataBlock.m_imageData[i] = gifBytes[byteIndex]; byteIndex++; } if (ib.m_imageDataList == null) { ib.m_imageDataList = new List <ImageBlock.ImageDataBlock>(); } ib.m_imageDataList.Add(imageDataBlock); } if (gifData.m_imageBlockList == null) { gifData.m_imageBlockList = new List <ImageBlock>(); } gifData.m_imageBlockList.Add(ib); }
static void SetImageBlock (byte[] gifBytes, ref int byteIndex, ref GifData gifData) { ImageBlock ib = new ImageBlock (); // Image Separator(1 Byte) // 0x2c ib.imageSeparator = gifBytes[byteIndex]; byteIndex++; // Image Left Position(2 Bytes) ib.imageLeftPosition = BitConverter.ToUInt16 (gifBytes, byteIndex); byteIndex += 2; // Image Top Position(2 Bytes) ib.imageTopPosition = BitConverter.ToUInt16 (gifBytes, byteIndex); byteIndex += 2; // Image Width(2 Bytes) ib.imageWidth = BitConverter.ToUInt16 (gifBytes, byteIndex); byteIndex += 2; // Image Height(2 Bytes) ib.imageHeight = BitConverter.ToUInt16 (gifBytes, byteIndex); byteIndex += 2; // 1 Byte { // Local Color Table Flag(1 Bit) ib.localColorTableFlag = (gifBytes[byteIndex] & 128) == 128; // 0b10000000 // Interlace Flag(1 Bit) ib.interlaceFlag = (gifBytes[byteIndex] & 64) == 64; // 0b01000000 // Sort Flag(1 Bit) ib.sortFlag = (gifBytes[byteIndex] & 32) == 32; // 0b00100000 // Reserved(2 Bits) // Unused // Size of Local Color Table(3 Bits) int val = (gifBytes[byteIndex] & 7) + 1; ib.sizeOfLocalColorTable = (int) Math.Pow (2, val); byteIndex++; } if (ib.localColorTableFlag) { // Local Color Table(0~255×3 Bytes) ib.localColorTable = new List<byte[]> (); for (int i = byteIndex; i < byteIndex + (ib.sizeOfLocalColorTable * 3); i += 3) { ib.localColorTable.Add (new byte[] { gifBytes[i], gifBytes[i + 1], gifBytes[i + 2] }); } byteIndex = byteIndex + (ib.sizeOfLocalColorTable * 3); } // LZW Minimum Code Size(1 Byte) ib.LzwMinimumCodeSize = gifBytes[byteIndex]; byteIndex++; // Block Size & Image Data List while (true) { // Block Size(1 Byte) byte blockSize = gifBytes[byteIndex]; byteIndex++; if (blockSize == 0x00) { // Block Terminator(1 Byte) break; } var imageDataBlock = new ImageBlock.ImageDataBlock (); imageDataBlock.blockSize = blockSize; // Image Data(? Bytes) imageDataBlock.imageData = new byte[imageDataBlock.blockSize]; for (int i = 0; i < imageDataBlock.imageData.Length; i++) { imageDataBlock.imageData[i] = gifBytes[byteIndex]; byteIndex++; } if (ib.imageDataList == null) { ib.imageDataList = new List<ImageBlock.ImageDataBlock> (); } ib.imageDataList.Add (imageDataBlock); } if (gifData.imageBlockList == null) { gifData.imageBlockList = new List<ImageBlock> (); } gifData.imageBlockList.Add (ib); }