2011-09-25 29 views
3

下面的C#代碼應該產生一個EMF,但查看輸出(在Vim中)顯示它是一個PNG。也許是S.O.上的某個人知道一個好的解決方法或解決方案。.NETLink生成PNG而不是EMF的圖形

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」]和收集使用MathKernel Result屬性的結果。

補遺

的MathKernel.Graphics屬性[1]顯然是一個淨圖形方法,其只處理圖像文件,例如位圖,而不是矢量圖形基於增強型圖元文件。

  1. http://reference.wolfram.com/legacy/v7/NETLink/ref/net/Wolfram.NETLink.MathKernel.Graphics.html

增強型圖元文件可通過.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

您是否已經從MathKernel啓動了一個非交互式前端過程,並將latted配置爲使用前者作爲'$ FrontEnd'?可能EMF文件由FrontEnd生成,不能在沒有它的情況下創建。請注意,* Mathematica *只能在Windows下導出EMF文件。 –

+0

@ Alexey - 謝謝。很可能EMFs只能在FrontEnd中生成。 MathKernel.GraphicsFormat儘管列出了「圖元文件」作爲輸出格式。等着瞧。 http://reference.wolfram.com/legacy/v7/NETLink/ref/net/Wolfram.NETLink.MathKernel.GraphicsFormat.html –

+0

在該頁面上,您所獲得的PNG格式未列出。 –

回答

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類。也許你可以澄清這一部分?

+0

@阿諾德,再次感謝。令人驚訝的是,.Net圖形方法/類不處理EMF,這對積累圖形很有用。我編輯了我的原始文章,並添加了一種傳送單個EMF的方法,而無需將它們寫入磁盤。 –