private 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[] pixels = lzwDecoder.DecodeImageData(imgDes.Width, imgDes.Height, dataSize, imgDes.InterlaceFlag); frame.IndexedPixel = pixels; int blockSize = streamHelper.Read(); DataStruct data = new DataStruct(blockSize, fs); GraphicEx graphicEx = null; if (graphics.Count > 0) { graphicEx = graphics[frameCount]; } frame.GraphicExtension = graphicEx; // Handle delta GIF images WriteableBitmap prev; if ((gifImage.LogicalScreenDescriptor.Packed == 245) && (frameCount > 0)) { prev = gifImage.Frames[frameCount - 1].Image; } else { prev = null; } WriteableBitmap img = GetImageFromPixel(pixels, frame.Palette, imgDes.InterlaceFlag, imgDes.Width, imgDes.Height, prev); frame.Image = img; gifImage.Frames.Add(frame); }
public CommentEx GetCommentEx(Stream stream) { CommentEx cmtEx = new CommentEx(); StreamHelper streamHelper = new StreamHelper(stream); cmtEx.CommentDatas = new List <string>(); int nextFlag = streamHelper.Read(); cmtEx.CommentDatas = new List <string>(); while (nextFlag != 0) { int blockSize = nextFlag; string data = streamHelper.ReadString(blockSize); cmtEx.CommentDatas.Add(data); nextFlag = streamHelper.Read(); } return(cmtEx); }
public static GifImage Decode(Stream fs) { StreamHelper streamHelper = null; GifImage gifImage = new GifImage(); List <GraphicEx> graphics = new List <GraphicEx>(); int frameCount = 0; 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(); } return(gifImage); }