Как преобразовать файл SVG в файл EMF в C#
определенно можно преобразовать SVG в EMF, например этот сайт. Интересно, можно ли добиться этого преобразования в C#?
обновление:
Я пытался читать файл SVG с помощью SVG.NET и привлечь его к Graphics
объект, затем попытался экспортировать Image
Как Метафайл .расширение emf (я следовал инструкции здесь:GDI+ / C#: Как сохранить изображение как EMF?). Чтение было сделано успешно, и изображение было экспортировано как .ЭДС. Однако, когда я открыл .emf в PowerPoint не может быть сгруппирован, что указывает на то, что информация о чертеже этого файла на самом деле не была сброшена правильно.
обновление 2:
Теперь он экспортирует ungroup-able .ЭДС, но разгруппировка показывает очень плохой результат. Я использовал следующий код для создания .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();
}
1 ответов
у меня была та же проблема, но поиск не дал никаких результатов.
Наконец, я закончил с моим собственным простым решением ниже. Я использовал 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);
}
}
сначала я создаю временный файл. Тогда я использую Draw(Graphics)
метод сохранения emf в нем. И, наконец, я прочитал байты из temp-файла.
Не пытайтесь использовать MemoryStream
на Metafile
. К сожалению, это не работает.