2014-10-01 29 views
5

Chắc chắn có thể chuyển đổi SVG thành EMF, ví dụ: this website. Tôi tự hỏi nếu nó có thể đạt được chuyển đổi này trong C#?Cách chuyển đổi tệp SVG sang tệp EMF trong C#


Cập nhật:

Tôi cố gắng để đọc một tập tin SVG sử dụng SVG.NET và vẽ nó vào một đối tượng Graphics, sau đó cố gắng xuất khẩu Image như một Metafile trong phần mở rộng .emf (Tôi làm theo các hướng dẫn ở đây : GDI+/C#: How to save an image as EMF?). Việc đọc đã được thực hiện thành công và hình ảnh đã được xuất dưới dạng .emf. Tuy nhiên, khi tôi mở tệp .emf đó trong PowerPoint, nó không thể bỏ nhóm, điều này cho biết rằng thông tin bản vẽ của tệp đó thực sự không được đổ một cách chính xác.

Cập nhật 2:

Bây giờ nó không xuất khẩu một .emf ungroup-thể, nhưng ungrouping cho thấy một kết quả thực sự nghèo. Tôi đã sử dụng đoạn mã sau để sản xuất .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(); 
} 

Trả lời

6

Tôi gặp vấn đề tương tự nhưng tìm kiếm không có kết quả.
Cuối cùng tôi đã kết thúc với giải pháp đơn giản của riêng tôi bên dưới. Tôi đã sử dụng SVG.NET.

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); 
    } 
} 

Lúc đầu, tôi tạo tệp tạm thời. Sau đó, tôi sử dụng phương pháp Draw(Graphics) để lưu emf trong đó. Và cuối cùng tôi đọc byte từ tập tin tạm thời.
Đừng cố gắng sử dụng MemoryStream cho Metafile. Thật không may, nó không hoạt động.

+0

nó đã được khoảng một năm và cuối cùng :) Tôi sẽ cố gắng giải pháp của bạn và trở lại với bạn sớm :) – nevets

+0

Bất kỳ tin tức? Nó có hoạt động trên máy của bạn không? – Skaiol

Các vấn đề liên quan