public void DecodeGif() { decoded = new Dictionary <ImageDescriptor, byte[]>(); frameCount = parser.Blocks.Count(i => i is ImageDescriptor); // var decodeProgress = new DecodeProgress { FrameCount = frameCount }; for (var i = 0; i < parser.Blocks.Count; i++) { var imageDescriptor = parser.Blocks[i] as ImageDescriptor; if (imageDescriptor == null) { continue; } var data = (TableBasedImageData)parser.Blocks[i + 1 + imageDescriptor.LocalColorTableFlag]; // ThreadPool.QueueUserWorkItem(context => // { // if (decodeProgress.Completed || decodeProgress.Exception != null) return; // byte[] colorIndexes; // try // { colorIndexes = LzwDecoder.Decode(data.ImageData, data.LzwMinimumCodeSize); // } // catch (Exception e) // { // decodeProgress.Exception = e; // decodeProgress.Completed = true; // onProgress(decodeProgress); // return; // } // lock (decoded) // { decoded.Add(imageDescriptor, colorIndexes); // decodeProgress.Progress++; // if (decoded.Count == frameCount) // { // try // { // decodeProgress.Gif = CompleteDecode(parser, decoded); // decodeProgress.Completed = true; // } // catch (Exception e) // { // decodeProgress.Exception = e; // decodeProgress.Completed = true; // } // } // // onProgress(decodeProgress); // } // }); } }
private static ImageFrame ReadImageFrame(Stream stream, byte[] globalColorTable, GraphicControlExtension graphicControlExtension) { var imageDescriptor = ImageDescriptor.Read(stream); var imageFrame = new ImageFrame { ImageDescriptor = imageDescriptor, LocalColorTable = globalColorTable, GraphicControlExtension = graphicControlExtension }; if (imageDescriptor.LocalColorTableFlag) { imageFrame.LocalColorTable = stream.ReadBytes(imageDescriptor.LocalColorTableSize * 3); } imageFrame.ColorDepth = stream.ReadByte(); var lzwDecoder = new LzwDecoder(stream); var imageData = lzwDecoder.DecodeImageData(imageDescriptor.ImageWidth, imageDescriptor.ImageHeight, imageFrame.ColorDepth); ApplicationData.Read(stream); imageFrame.Bitmap = CreateBitmap( imageData, imageFrame.GetPalette(), imageDescriptor.InterlaceFlag, imageDescriptor.ImageWidth, imageDescriptor.ImageHeight); return imageFrame; }
private static GifFrame DecodeFrame(GraphicControlExtension extension, ImageDescriptor descriptor, TableBasedImageData data, bool filled, int width, int height, Color32[] state, Color32[] colorTable) { var colorIndexes = LzwDecoder.Decode(data.ImageData, data.LzwMinimumCodeSize); return(DecodeFrame(extension, descriptor, colorIndexes, filled, width, height, state, colorTable)); }
/// <summary> /// Decode byte array in multiple threads. /// </summary> public static void DecodeParallel(byte[] bytes, Action <DecodeProgress> onProgress) // TODO: Refact { if (_free) { throw new Exception("The Free version doesn't support this feature. Please consider buying the Full version of Power GIF."); } GifParser parser; try { parser = new GifParser(bytes); } catch (Exception e) { onProgress(new DecodeProgress { Exception = e, Completed = true }); return; } var decoded = new Dictionary <ImageDescriptor, byte[]>(); var frameCount = parser.Blocks.Count(i => i is ImageDescriptor); var decodeProgress = new DecodeProgress { FrameCount = frameCount }; for (var i = 0; i < parser.Blocks.Count; i++) { var imageDescriptor = parser.Blocks[i] as ImageDescriptor; if (imageDescriptor == null) { continue; } var data = (TableBasedImageData)parser.Blocks[i + 1 + imageDescriptor.LocalColorTableFlag]; ThreadPool.QueueUserWorkItem(context => { if (decodeProgress.Completed || decodeProgress.Exception != null) { return; } byte[] colorIndexes; try { colorIndexes = LzwDecoder.Decode(data.ImageData, data.LzwMinimumCodeSize); } catch (Exception e) { decodeProgress.Exception = e; decodeProgress.Completed = true; onProgress(decodeProgress); return; } lock (decoded) { decoded.Add(imageDescriptor, colorIndexes); decodeProgress.Progress++; if (decoded.Count == frameCount) { try { decodeProgress.Gif = CompleteDecode(parser, decoded); decodeProgress.Completed = true; } catch (Exception e) { decodeProgress.Exception = e; decodeProgress.Completed = true; } } onProgress(decodeProgress); } }); } }