protected virtual RequestedAction Encode(IWICComponentFactory factory, IWICBitmapSource data, Size imageSize, ImageJob job) { WicEncoderPlugin encoder = new WicEncoderPlugin(job.Settings, job.SourcePathData); //Create the IStream/MemoryStream var outputStream = new MemoryIStream(); encoder.EncodeToStream(factory, data, imageSize, outputStream); object dest = job.Dest; // Try to save the bitmap if (dest is string) { //Make physical and resolve variable references all at the same time. job.FinalPath = job.ResolveTemplatedPath(job.Dest as string, delegate(string var) { if ("ext".Equals(var, StringComparison.OrdinalIgnoreCase)) return encoder.Extension; if ("width".Equals(var, StringComparison.OrdinalIgnoreCase)) return imageSize.Width.ToString(); if ("height".Equals(var, StringComparison.OrdinalIgnoreCase)) return imageSize.Height.ToString(); return null; }); //If requested, auto-create the parent directory(ies) if (job.CreateParentDirectory) { string dirName = Path.GetDirectoryName(job.FinalPath); if (!Directory.Exists(dirName)) Directory.CreateDirectory(dirName); } using (FileStream fs = new FileStream(job.FinalPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) { outputStream.WriteTo(fs); } } else if (dest is Stream) { outputStream.WriteTo((Stream)dest); } else return RequestedAction.None; return RequestedAction.Cancel; }
public void Write(System.Drawing.Image i, System.IO.Stream s) { //A list of COM objects to destroy List<object> com = new List<object>(); try { var factory = (IWICComponentFactory)new WICImagingFactory(); com.Add(factory); Stopwatch conversion = new Stopwatch(); conversion.Start(); IWICBitmap b = ConversionUtils.ToWic(factory,i as Bitmap); conversion.Stop(); Stopwatch encoding = new Stopwatch(); encoding.Start(); //Prepare output stream var outputStream = new MemoryIStream(); EncodeToStream(factory, b, i.Size, outputStream); encoding.Stop(); Stopwatch streaming = new Stopwatch(); streaming.Start(); outputStream.WriteTo(s); streaming.Stop(); } finally { //Manually cleanup all the com reference counts, aggressively while (com.Count > 0) { Marshal.ReleaseComObject(com[com.Count - 1]); //In reverse order, so no item is ever deleted out from under another. com.RemoveAt(com.Count - 1); } } }