/// <summary> /// Processes the image. /// </summary> /// <param name="processor"> /// The processor. /// </param> /// <param name="factory"> /// The factory. /// </param> private static void ApplyProcessor(Func<ImageFactory, Image> processor, ImageFactory factory) { ImageInfo imageInfo = factory.Image.GetImageInfo(factory.ImageFormat); if (imageInfo.IsAnimated) { OctreeQuantizer quantizer = new OctreeQuantizer(255, 8); // We don't dispose of the memory stream as that is disposed when a new image is created and doing so // beforehand will cause an exception. MemoryStream stream = new MemoryStream(); using (GifEncoder encoder = new GifEncoder(stream, null, null, imageInfo.LoopCount)) { foreach (GifFrame frame in imageInfo.GifFrames) { factory.Update(frame.Image); frame.Image = quantizer.Quantize(processor.Invoke(factory)); encoder.AddFrame(frame); } } stream.Position = 0; factory.Update(Image.FromStream(stream)); } else { factory.Update(processor.Invoke(factory)); } // Set the property item information from any Exif metadata. // We do this here so that they can be changed between processor methods. if (factory.PreserveExifData) { foreach (KeyValuePair<int, PropertyItem> propertItem in factory.ExifPropertyItems) { try { factory.Image.SetPropertyItem(propertItem.Value); } // ReSharper disable once EmptyGeneralCatchClause catch { // Do nothing. The image format does not handle EXIF data. // TODO: empty catch is fierce code smell. } } } }
/// <summary> /// Applies the given processor the current image. /// </summary> /// <param name="processor"> /// The processor delegate. /// </param> private void ApplyProcessor(Func<ImageFactory, Image> processor) { ImageInfo imageInfo = this.Image.GetImageInfo(this.ImageFormat); if (imageInfo.IsAnimated) { OctreeQuantizer quantizer = new OctreeQuantizer(255, 8); // We don't dispose of the memory stream as that is disposed when a new image is created and doing so // beforehand will cause an exception. MemoryStream stream = new MemoryStream(); using (GifEncoder encoder = new GifEncoder(stream, null, null, imageInfo.LoopCount)) { foreach (GifFrame frame in imageInfo.GifFrames) { this.Image = frame.Image; frame.Image = quantizer.Quantize(processor.Invoke(this)); encoder.AddFrame(frame); } } stream.Position = 0; this.Image = Image.FromStream(stream); } else { this.Image = processor.Invoke(this); } }