如果使用Image.Save方法将图像保存到EMF/WMF,则会出现异常(http://msdn.microsoft.com/en-us/library/ktx83wah.aspx)
还有另一种方法可以将图像保存到EMF/WMF吗?有没有可用的编码器?
小智 21
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();
Run Code Online (Sandbox Code Playgroud)
这是你想要做的大部分时间,因为那是EMF的用途:以GDI +绘图命令的形式保存矢量图像.
您可以Bitmap使用上述方法并调用将其保存到EMF文件ig.DrawImage(your_bitmap),但请注意,这不会将您的栅格数据神奇地转换为矢量图像.
eri*_*len 12
如果我没记错的话,可以使用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.
Run Code Online (Sandbox Code Playgroud)
我认为这就是我解决问题的方法.
图元文件是记录 GDI 操作序列的文件。它是可缩放的,因为生成图片的原始操作序列被捕获,因此可以缩放记录的坐标。
我认为,在 .NET 中,您应该创建一个Metafile对象,Graphics使用 创建一个对象Graphics.FromImage,然后执行绘图步骤。当您在文件上绘图时,该文件会自动更新。您可以在Graphics.AddMetafileComment的文档中找到一个小示例。
如果您确实想将位图存储在图元文件中,请使用这些步骤,然后用于Graphics.DrawImage绘制位图。但是,当缩放时,它将使用 进行拉伸StretchBlt。
| 归档时间: |
|
| 查看次数: |
29906 次 |
| 最近记录: |