C# 如何在C中将SVG文件转换为EMF文件#
例如,将SVG转换为EMF是完全可能的。我想知道是否有可能用C实现这种转换C# 如何在C中将SVG文件转换为EMF文件#,c#,.net,svg,.emf,C#,.net,Svg,.emf,例如,将SVG转换为EMF是完全可能的。我想知道是否有可能用C实现这种转换 更新: 我尝试使用读取SVG文件并将其绘制到图形对象,然后尝试将图像导出为.emf扩展名中的图元文件(我按照此处的说明:)。读取已成功完成,图像已导出为.emf。但是,当我在PowerPoint中打开该.emf时,它无法取消分组,这表明该文件的绘图信息实际上没有正确转储 更新2: 现在它确实导出了ungroup-able.emf,但是解组显示的结果非常糟糕。我使用以下代码生成.emf: private void Ope
更新: 我尝试使用读取SVG文件并将其绘制到
图形
对象,然后尝试将图像
导出为.emf扩展名中的图元文件(我按照此处的说明:)。读取已成功完成,图像已导出为.emf。但是,当我在PowerPoint中打开该.emf时,它无法取消分组,这表明该文件的绘图信息实际上没有正确转储
更新2:
现在它确实导出了ungroup-able.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();
}
我也有同样的问题,但搜索没有结果。
最后,我在下面给出了我自己的简单解决方案。我用过
公共静态字节[]ConvertToEmf(字符串svgImage)
{
字符串emftempath=Path.GetTempFileName();
尝试
{
var svg=SvgDocument.FromSvg(svgImage);
使用(Graphics bufferGraphics=Graphics.fromHwnInternal(IntPtr.Zero))
{
使用(var metafile=new metafile(emftempath,bufferGraphics.GetHdc())
{
使用(Graphics=Graphics.FromImage(图元文件))
{
绘制(图形);
}
}
}
返回文件.ReadAllBytes(emfTempPath);
}
最后
{
文件.Delete(emftempath);
}
}
首先,我创建一个临时文件。然后我使用Draw(Graphics)
方法在其中保存emf。最后我从临时文件中读取字节。不要尝试对
图元文件使用MemoryStream
。不幸的是,它不起作用。我发现这是目前最好的解决方案。这几乎与公认的答案和用法相似,但可以在内存中执行
重要的变化是释放手柄和重置位置记忆流
公共静态流转换器svgtoemf(字符串svgImage)
{
使用var writeStream=newmemoryStream();
var svg=SvgDocument.FromSvg(svgImage);
var stream=newmemoryStream();
var sizeImage=新位图((int)svg.Width.Value,(int)svg.Height.Value);
使用(var graphicsFromSizedImage=Graphics.FromImage(Image.FromHbitmap(sizedImage.GetHbitmap()))
使用(var metafile=new metafile(stream,graphicsFromSizedImage.GetHdc(),EmfType.EmfPlusOnly))//为较小的文件大小指定EmfType
使用(var graphics=graphics.FromImage(图元文件))
{
绘制(图形);
graphicsFromSizedImage.ReleaseHdc();
}
流位置=0;
回流;
}
请注意,底层实现依赖于System.Drawing
,因此必须可以访问gdi
。在基于linux的操作系统(或Docker映像)上,必须安装libgdiplus
正如系统。绘图被认为是,像这样的替代方案可能更适合您的情况。已经过去了一年,最后:)我将尝试您的解决方案,并很快返回给您:)有什么想法如何做反向?从.emf到.svg?
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);
}
}