Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中将SVG文件转换为EMF文件#_C#_.net_Svg_.emf - Fatal编程技术网

C# 如何在C中将SVG文件转换为EMF文件#

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是完全可能的。我想知道是否有可能用C实现这种转换


更新:

我尝试使用读取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);
    }
}