예제 #1
0
        static void ReadImage(StreamHelper streamHelper, Stream fs, GifImage gifImage, List <GraphicEx> graphics, int frameCount)
        {
            ImageDescriptor imgDes = streamHelper.GetImageDescriptor(fs);
            GifFrame        frame  = new GifFrame();

            frame.ImageDescriptor = imgDes;
            frame.LocalColorTable = gifImage.GlobalColorTable;
            if (imgDes.LctFlag)
            {
                frame.LocalColorTable = streamHelper.ReadByte(imgDes.LctSize * 3);
            }
            LZWDecoder lzwDecoder = new LZWDecoder(fs);
            int        dataSize   = streamHelper.Read();

            frame.ColorDepth = dataSize;
            byte[] piexel = lzwDecoder.DecodeImageData(imgDes.Width, imgDes.Height, dataSize);
            frame.IndexedPixel = piexel;
            int        blockSize = streamHelper.Read();
            DataStruct data      = new DataStruct(blockSize, fs);
            GraphicEx  graphicEx = graphics[frameCount];

            frame.GraphicExtension = graphicEx;
            Bitmap img = GetImageFromPixel(piexel, frame.Palette, imgDes.InterlaceFlag, imgDes.Width, imgDes.Height);

            frame.Image = img;
            gifImage.Frames.Add(frame);
        }
예제 #2
0
        internal DataStruct(int blockSize, Stream stream)
        {
            StreamHelper streamHelper = new StreamHelper(stream);

            _blockSize = (byte)blockSize;
            if (_blockSize > 0)
            {
                _data = streamHelper.ReadByte(_blockSize);
            }
        }
예제 #3
0
        internal static GifImage Decode(string gifPath)
        {
            FileStream       fs           = null;
            StreamHelper     streamHelper = null;
            GifImage         gifImage     = new GifImage();
            List <GraphicEx> graphics     = new List <GraphicEx>();
            int frameCount = 0;

            try
            {
                fs              = new FileStream(gifPath, FileMode.Open);
                streamHelper    = new StreamHelper(fs);
                gifImage.Header = streamHelper.ReadString(6);
                gifImage.LogicalScreenDescriptor = streamHelper.GetLCD(fs);
                if (gifImage.LogicalScreenDescriptor.GlobalColorTableFlag)
                {
                    gifImage.GlobalColorTable = streamHelper.ReadByte(gifImage.LogicalScreenDescriptor.GlobalColorTableSize * 3);
                }
                int nextFlag = streamHelper.Read();
                while (nextFlag != 0)
                {
                    if (nextFlag == GifExtensions.ImageLabel)
                    {
                        ReadImage(streamHelper, fs, gifImage, graphics, frameCount);
                        frameCount++;
                    }
                    else if (nextFlag == GifExtensions.ExtensionIntroducer)
                    {
                        int gcl = streamHelper.Read();
                        switch (gcl)
                        {
                        case GifExtensions.GraphicControlLabel:
                        {
                            GraphicEx graphicEx = streamHelper.GetGraphicControlExtension(fs);
                            graphics.Add(graphicEx);
                            break;
                        }

                        case GifExtensions.CommentLabel:
                        {
                            CommentEx comment = streamHelper.GetCommentEx(fs);
                            gifImage.CommentExtensions.Add(comment);
                            break;
                        }

                        case GifExtensions.ApplicationExtensionLabel:
                        {
                            ApplicationEx applicationEx = streamHelper.GetApplicationEx(fs);
                            gifImage.ApplictionExtensions.Add(applicationEx);
                            break;
                        }

                        case GifExtensions.PlainTextLabel:
                        {
                            PlainTextEx textEx = streamHelper.GetPlainTextEx(fs);
                            gifImage.PlainTextEntensions.Add(textEx);
                            break;
                        }
                        }
                    }
                    else if (nextFlag == GifExtensions.EndIntroducer)
                    {
                        break;
                    }
                    nextFlag = streamHelper.Read();
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                fs.Close();
            }
            return(gifImage);
        }