コード例 #1
0
ファイル: GifReader.cs プロジェクト: swipswaps/PixelVision8
        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);
                // }
                // });
            }
        }
コード例 #2
0
		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;
		}
コード例 #3
0
        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));
        }
コード例 #4
0
        /// <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);
                    }
                });
            }
        }