当前位置:  开发笔记 > 编程语言 > 正文

GDI +/C#:如何将图像保存为EMF?

如何解决《GDI+/C#:如何将图像保存为EMF?》经验,为你挑选了2个好方法。

如果使用Image.Save方法将图像保存到EMF/WMF,则会出现异常(http://msdn.microsoft.com/en-us/library/ktx83wah.aspx)

还有另一种方法可以将图像保存到EMF/WMF吗?有没有可用的编码器?



1> 小智..:

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),但请注意,这不会将您的栅格数据神奇地转换为矢量图像.



2> erikkallen..:

如果我没记错的话,可以使用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.

我认为这就是我解决问题的方法.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有