public ExtraInformation(byte[] bytes, ref int byteIndex) { // Extension Introducer(1 byte) // 0x21 Introducer = bytes[byteIndex]; byteIndex++; // Extension Label(1 byte) // 0xFF Label = bytes[byteIndex]; byteIndex++; // Block Size(1 byte) // 0x0B BlockSize = bytes[byteIndex]; byteIndex++; // Application Identifier(8 byte) ApplicationIdentifier = Encoding.ASCII.GetString(bytes, byteIndex, 8); byteIndex += 8; // Application Authentication Code(3 byte) ApplicationAuthenticationCode = Encoding.ASCII.GetString(bytes, byteIndex, 3); byteIndex += 3; Blocks = new List <BytesBlock>(); // Block Size & Application Data List while (true) { // Block Size (1 byte) var blockSize = bytes[byteIndex]; byteIndex++; if (blockSize == 0x00) { // Block Terminator(1 byte) break; } var block = new BytesBlock(); block.Size = blockSize; // Application Data(n byte) block.Bytes = new byte[block.Size]; for (var index = 0; index < block.Bytes.Length; index++) { block.Bytes[index] = bytes[byteIndex]; byteIndex++; } Blocks.Add(block); } }
public ExtraComment(byte[] bytes, ref int byteIndex) { // Extension Introducer(1 byte) // 0x21 Introducer = bytes[byteIndex]; byteIndex++; // Comment Label(1 byte) // 0xFE Label = bytes[byteIndex]; byteIndex++; Blocks = new List <BytesBlock>(); // Block Size & Comment Data List while (true) { // Block Size(1 byte) var blockSize = bytes[byteIndex]; byteIndex++; if (blockSize == 0x00) { // Block Terminator(1 byte) break; } var block = new BytesBlock(); block.Size = blockSize; // Comment Data(n byte) block.Bytes = new byte[block.Size]; for (var index = 0; index < block.Bytes.Length; index++) { block.Bytes[index] = bytes[byteIndex]; byteIndex++; } Blocks.Add(block); } }
public ExtraText(byte[] bytes, ref int byteIndex) { // Extension Introducer(1 byte) // 0x21 Introducer = bytes[byteIndex]; byteIndex++; // Plain Text Label(1 byte) // 0x01 Label = bytes[byteIndex]; byteIndex++; // Block Size(1 byte) // 0x0c BlockSize = bytes[byteIndex]; byteIndex++; // Text Grid Left Position(2 byte) // Not supported byteIndex += 2; // Text Grid Top Position(2 byte) // Not supported byteIndex += 2; // Text Grid Width(2 byte) // Not supported byteIndex += 2; // Text Grid Height(2 byte) // Not supported byteIndex += 2; // Character Cell Width(1 byte) // Not supported byteIndex++; // Character Cell Height(1 byte) // Not supported byteIndex++; // Text Foreground Color Index(1 byte) // Not supported byteIndex++; // Text Background Color Index(1 byte) // Not supported byteIndex++; Blocks = new List <BytesBlock>(); // Block Size & Plain Text Data List while (true) { // Block Size(1 byte) var blockSize = bytes[byteIndex]; byteIndex++; if (blockSize == 0x00) { // Block Terminator(1 byte) break; } var block = new BytesBlock(); block.Size = blockSize; // Plain Text Data(n byte) block.Bytes = new byte[block.Size]; for (var index = 0; index < block.Bytes.Length; index++) { block.Bytes[index] = bytes[byteIndex]; byteIndex++; } Blocks.Add(block); } }
public FrameImageDescriptor(byte[] bytes, ref int byteIndex) { //描述器标识符 0x2c (1 byte) Separator = bytes[byteIndex]; byteIndex++; //图像起始点 (2 byte) MarginLeft = BitConverter.ToUInt16(bytes, byteIndex); byteIndex += 2; //图像起始点 (2 byte) MarginTop = BitConverter.ToUInt16(bytes, byteIndex); byteIndex += 2; //图像宽度 (2 byte) Width = BitConverter.ToUInt16(bytes, byteIndex); byteIndex += 2; //图像高度 (2 byte) Height = BitConverter.ToUInt16(bytes, byteIndex); byteIndex += 2; #region Packet Fields (1 byte) //此处算法参照全局配置 //是否使用局部色表 (1 bit) LocalColorTableFlag = bytes[byteIndex] >> 7 == 1; //是否包含交错 (1 bit) FlagInterlace = (bytes[byteIndex] >> 6) % 2 == 1; //重要颜色靠前标识 (1 bit) FlagSort = (bytes[byteIndex] >> 5) % 2 == 1; //保留字段 (2 bit) Reserved = (bytes[byteIndex] >> 3) % 4; //局部色表长度 (3 bit) int power = bytes[byteIndex] % 8 + 1; LocalColorTableSize = (int)Math.Pow(2, power); #endregion //指针下移 byteIndex++; LocalColorTable = new Color32[LocalColorTableSize]; //是否包含局部色表,计算方法参照全局色表 if (LocalColorTableFlag) { for (int localColorIndex = 0; localColorIndex < LocalColorTableSize; localColorIndex++) { LocalColorTable[localColorIndex] = new Color32(bytes[byteIndex], bytes[byteIndex + 1], bytes[byteIndex + 2], 255); byteIndex += 3; } } //Lzw解码后 拆分成色号的单位bit长度(1 byte) LzwCodeSize = bytes[byteIndex]; byteIndex++; var lzwPixelsBlocks = new List <BytesBlock>(); //紧接着是表示色号的lzw压缩后的字节块 结构:长度+数据+长度+数据+...+结尾符 while (true) { //字节块长度(1 byte) var blockSize = bytes[byteIndex]; byteIndex++; //判断是否为结尾符 if (blockSize == 0x00) { break; } //初始化字节块 var block = new BytesBlock(); block.Size = blockSize; block.Bytes = new byte[block.Size]; //字节块赋值 for (var index = 0; index < block.Bytes.Length; index++) { block.Bytes[index] = bytes[byteIndex]; byteIndex++; } lzwPixelsBlocks.Add(block); } LzwPixelsBlocks = lzwPixelsBlocks.ToArray(); }