Wolfram mathematica .NETLink图形生成PNG而不是EMF

Wolfram mathematica .NETLink图形生成PNG而不是EMF,wolfram-mathematica,Wolfram Mathematica,下面的C#代码应该会产生一个EMF,但是查看输出(在Vim中)会发现它是一个PNG。也许S.O.上的某个人知道一个很好的变通方法或解决方案 MathKernel k = new MathKernel(); k.CaptureGraphics = true; k.GraphicsFormat = "Metafile"; k.Compute("Show[Graphics[{Thick, Blue, Circle[{#, 0}] & /@ Range[4], Black, Dashed, Li

下面的C#代码应该会产生一个EMF,但是查看输出(在Vim中)会发现它是一个PNG。也许S.O.上的某个人知道一个很好的变通方法或解决方案

MathKernel k = new MathKernel();
k.CaptureGraphics = true;
k.GraphicsFormat = "Metafile";
k.Compute("Show[Graphics[{Thick, Blue, Circle[{#, 0}] & /@ Range[4], Black, Dashed, Line[{{0, 0}, {5, 0}}]}]]");
k.Graphics[0].Save("C:\\Temp\\file.emf", System.Drawing.Imaging.ImageFormat.Emf);
到目前为止,我正在考虑将[Graphics…]包装在ExportString[…,“EMF”]中,并使用MathKernel结果属性收集结果

附录

显然,MathKernel.Graphics属性[1]是一种.Net图形方法,它只处理位图等图像文件,而不处理基于矢量图形的增强元文件

  • 增强型图元文件可以通过.NETLink一次传输一个,方式如下:

    using System;
    using System.IO;
    using Wolfram.NETLink;
    
    public class Example
    {
        public static void Main(String[] args)
        {
            MathKernel k = new MathKernel();
            k.Compute("ExportString[Graphics[{Disk[]}], {\"Base64\", \"EMF\"}]");
            byte[] decodedBytes = Convert.FromBase64String(k.Result.ToString());
            // The transferred EMF can be used or simply written out to file.
            File.WriteAllBytes("C:\\Temp\\file.emf", decodedBytes);
        }
    }
    

    以下是一个可行的解决方案:

    using System;
    using Wolfram.NETLink;
    
    public class Example {
    
     public static void Main(String[] args) {
    
      MathKernel k = new MathKernel();
      k.Compute("Export[\"c:/users/arnoudb/out.emf\", Graphics[{Disk[]}], \"EMF\"]");
      }
    
    } 
    
    我不知道你为什么要考虑这一部分:

    k.Graphics[0].Save("C:\\Temp\\file.emf", System.Drawing.Imaging.ImageFormat.Emf);
    

    Mathematica bug,因为k.Graphics[0]是一个纯C#System.Drawing.Image类。也许您可以澄清一下这一部分?

    您是否从MathKernel启动了一个非交互式前端进程,并将latted配置为将前者用作
    $FrontEnd
    ?EMF文件可能是由前端生成的,没有它就无法创建。另外请注意,Mathematica只能在Windows下导出EMF文件。@Alexey-谢谢。很可能电磁波只在前端产生。但MathKernel.GraphicsFormat将“图元文件”列为输出格式。我会看到的。在该页上,您获得的PNG格式未列出。@Arnoud,再次感谢。令人惊讶的是,.Net Graphics方法/类没有处理EMF,这对累积图形很有用。我编辑了我的原始帖子,并添加了一种方法,可以传输单个EMF,而无需将其写入磁盘。