将SVG转换为EMF绝对是可能的,例如本网站.我想知道是否有可能在C#中实现这种转换?
更新:
我尝试使用SVG.NET读取SVG文件并将其绘制到一个Graphics对象,然后尝试将其导出Image为.emf扩展名中的MetaFile(我按照此处的说明操作:GDI +/C#:如何将图像另存为EMF?).读取成功完成,图像输出为.emf.但是,当我在PowerPoint中打开.emf时,它无法取消分组,这表明该文件的绘图信息实际上没有正确转储.
更新2:
现在它确实导出了一个无组合的.emf,但是取消组合显示效果非常糟糕.我使用以下代码生成.emf:
private void OpenPictureButtonClick(object sender, EventArgs e)
{
var openFileDialog = new OpenFileDialog();
openFileDialog.ShowDialog();
_svgDoc = SvgDocument.Open(openFileDialog.FileName);
RenderSvg(_svgDoc);
}
private void SavePictureClick(object sender, EventArgs e)
{
var saveFileDialog = new SaveFileDialog {Filter = "Enhanced Meta File | *.Emf"};
saveFileDialog.ShowDialog();
var path = saveFileDialog.FileName;
var graphics = CreateGraphics();
var img = new Metafile(path, graphics.GetHdc());
var ig = Graphics.FromImage(img);
_svgDoc.Draw(ig);
ig.Dispose(); img.Dispose(); graphics.ReleaseHdc(); graphics.Dispose();
}
private void RenderSvg(SvgDocument svgDoc)
{
svgImageBox.Image = svgDoc.Draw();
}
Run Code Online (Sandbox Code Playgroud)
我有同样的问题,但搜索没有结果.
最后,我最终得到了我自己的简单解决方案.我用过SVG.NET.
public static byte[] ConvertToEmf(string svgImage)
{
string emfTempPath = Path.GetTempFileName();
try
{
var svg = SvgDocument.FromSvg<SvgDocument>(svgImage);
using (Graphics bufferGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
{
using (var metafile = new Metafile(emfTempPath, bufferGraphics.GetHdc()))
{
using (Graphics graphics = Graphics.FromImage(metafile))
{
svg.Draw(graphics);
}
}
}
return File.ReadAllBytes(emfTempPath);
}
finally
{
File.Delete(emfTempPath);
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我创建一个临时文件.然后我使用Draw(Graphics)方法来保存emf.最后我从temp文件中读取字节.
不要尝试使用MemoryStream了Metafile.不幸的是,它没有用.