.NETLink Graphics生成PNG而不是EMF

时间:2011-09-25 00:27:04

标签: 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, Line[{{0, 0}, {5, 0}}]}]]");
k.Graphics[0].Save("C:\\Temp\\file.emf", System.Drawing.Imaging.ImageFormat.Emf);

到目前为止,我正在考虑在ExportString [...,“EMF”]中包装Show [Graphics ...]并使用MathKernel Result属性收集结果。

附录

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

  1. http://reference.wolfram.com/legacy/v7/NETLink/ref/net/Wolfram.NETLink.MathKernel.Graphics.html
  2. 增强型图元文件可以通过.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);
        }
    }
    

1 个答案:

答案 0 :(得分:4)

这是一个有效的解决方案:

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错误,因为k.Graphics [0]是纯C#System.Drawing.Image类。也许你可以澄清一下这部分?