Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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();
        }