如果使用Image.Save方法将图像保存到EMF/WMF,则会出现异常(http://msdn.microsoft.com/en-us/library/ktx83wah.aspx)
还有另一种方法可以将图像保存到EMF/WMF吗?有没有可用的编码器?
Image
是一个抽象类:你想做什么取决于你是在处理a Metafile
还是a Bitmap
.
使用GDI +创建图像并将其另存为EMF非常简单Metafile
.每个迈克的帖子:
var path = @"c:\foo.emf" var g = CreateGraphics(); // get a graphics object from your form, or wherever var img = new Metafile(path, g.GetHdc()); // file is created here var ig = Graphics.FromImage(img); // call drawing methods on ig, causing writes to the file ig.Dispose(); img.Dispose(); g.ReleaseHdc(); g.Dispose();
这是你想要做的大部分时间,因为那是EMF的用途:以GDI +绘图命令的形式保存矢量图像.
您可以Bitmap
使用上述方法并调用将其保存到EMF文件ig.DrawImage(your_bitmap)
,但请注意,这不会将您的栅格数据神奇地转换为矢量图像.
如果我没记错的话,可以使用Metafile.GetHenhmetafile(),API GetEnhMetaFileBits()和Stream.Write()的组合来完成
[DllImport("gdi32")] static extern uint GetEnhMetaFileBits(IntPtr hemf, uint cbBuffer, byte[] lpbBuffer); IntPtr h = metafile.GetHenhMetafile(); int size = GetEnhMetaFileBits(h, 0, null); byte[] data = new byte[size]; GetEnhMetaFileBits(h, size, data); using (FileStream w = File.Create("out.emf")) { w.Write(data, 0, size); } // TODO: I don't remember whether the handle needs to be closed, but I guess not.
我认为这就是我解决问题的方法.