public static void Save(this Metafile metafile, Stream stream, bool forceWmfFormat) { if (metafile == null) { throw new ArgumentNullException(nameof(metafile), PublicResources.ArgumentNull); } if (stream == null) { throw new ArgumentNullException(nameof(stream), PublicResources.ArgumentNull); } if (!OSUtils.IsWindows) { throw new PlatformNotSupportedException(Res.RequiresWindows); } bool isWmf = metafile.RawFormat.Guid == ImageFormat.Wmf.Guid; if (isWmf || forceWmfFormat) { WriteWmfHeader(metafile, stream); } // making a clone, otherwise, it will not be usable after saving metafile = (Metafile)metafile.Clone(); IntPtr handle = metafile.GetHenhmetafile(); try { byte[] buffer = isWmf ? Gdi32.GetWmfContent(handle) : (forceWmfFormat ? Gdi32.GetWmfContentFromEmf(handle) : Gdi32.GetEmfContent(handle)); stream.Write(buffer, 0, buffer.Length); } finally { if (isWmf) { Gdi32.DeleteMetaFile(handle); } else { Gdi32.DeleteEnhMetaFile(handle); } metafile.Dispose(); } }
private void propertiesComboBox__SelectedIndexChanged(object sender, EventArgs e) { var selectedItem = propertiesComboBox_.SelectedItem; if (selectedItem == null) { return; } switch (selectedItem.ToString()) { case "Metafile": propertyGrid_.SelectedObject = metafile_; break; case "MetafileHeader": propertyGrid_.SelectedObject = metafile_.GetMetafileHeader(); break; case "ENHMETAHEADER": using (var metafile = MetafileUtility.CopyMetafile(ref metafile_)) { // Metafile.GetHenhmetafile is just a wrapper of GdipGetHemfFromMetafile: // https://github.com/dotnet/runtime/blob/78c6505cffe2558b036fbe44cd27038affbb6cce/src/libraries/System.Drawing.Common/src/System/Drawing/Imaging/Metafile.Windows.cs#L379-L383 // and according to: // http://www.jose.it-berater.org/gdiplus/reference/flatapi/graphics/gdipgethemffrommetafile.htm // > GdipGetHemfFromMetafile: // > This method sets the Metafile object to an invalid state. The user is responsible for calling DeleteEnhMetafile, // > to delete the Windows handle. var enhMetafileHandle = metafile.GetHenhmetafile(); if (enhMetafileHandle != IntPtr.Zero) { var header = Gdi32.GetEnhMetaFileHeader(enhMetafileHandle); propertyGrid_.SelectedObject = new EnhMetaHeader(header); Gdi32.DeleteEnhMetaFile(enhMetafileHandle); } } break; default: Debug.Assert(false); break; } }