コード例 #1
0
        private IGIFBlock ReadImage(BinaryReader aReader, GIFImage aImage)
        {
            var res = new GIFImageBlock();

            res.xPos   = aReader.ReadUInt16();
            res.yPos   = aReader.ReadUInt16();
            res.width  = aReader.ReadUInt16();
            res.height = aReader.ReadUInt16();
            res.flags  = (EImageDescriptorFlags)aReader.ReadByte();
            if (res.HasLocalColorTable)
            {
                Log("Read local color table: " + res.SizeOfLocalColorTable);
                res.usedColorTable =
                    res.colorTable = ReadColorTable(aReader, res.SizeOfLocalColorTable);
            }
            else
            {
                res.colorTable     = null;
                res.usedColorTable = aImage.screen.globalColorTable;
            }
            if (lastGrCtrl != null)
            {
                res.graphicControl = lastGrCtrl;
                lastGrCtrl         = null;
            }
            Log("Start LZW");
            ReadLZWImage(aReader, res);
            return(res);
        }
コード例 #2
0
        private void ReadLZWImage(BinaryReader aReader, GIFImageBlock res)
        {
            byte initialCodeSize = aReader.ReadByte();
            var  bitReader       = new BitStreamReader(aReader);
            var  output          = new List <byte>();
            var  dict            = new Dict(initialCodeSize);
            long startPos        = aReader.BaseStream.Position;

            while (!bitReader.EndOfData)
            {
                int code = (int)bitReader.ReadBits(dict.bits);
                if (bitReader.EndOfData)
                {
                    break;
                }
                if (code == dict.ClearCode)
                {
                    dict.Clear();
                }
                else if (code == dict.EODCode)
                {
                    break;
                }
                else
                {
                    int pre = dict.Expand(code, output);
                    if (pre != -1 && dict.lastCode != -1)
                    {
                        dict.AddPair(dict.lastCode, (byte)pre);
                    }
                    dict.lastCode = code;
                }
            }
            if (!bitReader.EndOfData)
            {
                byte tmp = 1;
                while (tmp != 0 && aReader.BaseStream.Position < aReader.BaseStream.Length)
                {
                    tmp = aReader.ReadByte();
                }
            }
            res.packedSize = (int)(aReader.BaseStream.Position - startPos);
            res.data       = output;
            GIFLoader.Log("Image Data:" + output.Count + " (packed: " + res.packedSize + ")");
            GIFLoader.Log("X: " + res.xPos + "  Y: " + res.yPos);
            GIFLoader.Log("W: " + res.width + "  H: " + res.height);
            GIFLoader.Log("Winterlaced: " + res.IsInterlaced);
            GIFLoader.Log("---");
        }