Преобразование SVG в PNG с помощью C#

Я пытался преобразовать изображения SVG в PNG с помощью C# без необходимости писать слишком много кода. Может ли кто-нибудь порекомендовать для этого библиотеку или пример кода?

Я нашел хорошую и простую библиотеку, которую вы можете использовать в C# github.com/ElinamLLC/SharpVectors, она может конвертировать многие типы svg в bmp, jpeg или png

Mahdi 07.01.2019 10:45

Могу я сказать: эти решения плохие, в том числе wkhtml2pdf / wkhtml2image и т. д. Спецификация SVG сложна и развивается, как и стили CSS, и, кроме того, они должны выглядеть так же, как в браузере. wkhtml2X, например, имеет огромные проблемы со шрифтами, а движок webkit внутри слишком стар. К счастью, есть решение: в Chrome есть безголовый режим, а с его Debugging-API вы можете получать PNG-изображения и PDF-файлы из самого Headless-Chrome с помощью MasterDevs / ChromeDevTools на C#: Пример: github.com/ststeiger/ChromeDevTools/blob/master/source/…

Stefan Steiger 05.09.2019 09:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
105
2
108 821
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Для этого вы можете вызвать версию inkscape для командной строки:

http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx

Также существует механизм рендеринга SVG C#, который в первую очередь предназначен для использования файлов SVG в Интернете в кодовом пакете, который может удовлетворить ваши потребности, если это ваша проблема:

Оригинальный проект
http://www.codeplex.com/svg

Форк с исправлениями и дополнительной активностью: (добавлен 07.07.2013)
https://github.com/vvvv/SVG

Спасибо, Эспо. Я действительно написал это сообщение в блоге inkscape! Хотя это "работает", это не особо надежное решение. Хотя мне нравится проект codeplex - я его посмотрю. Спасибо.

harriyott 12.09.2008 17:16

Как обидно :) Хорошо, что движок рендеринга SVG может вам помочь.

Espo 12.09.2008 17:19

Я воспринимаю это как комплимент. Я не цитировал себя раньше!

harriyott 12.09.2008 17:36

Вы пробовали движок рендеринга svg? Можете ли вы поделиться своим решением, пожалуйста. Я пытаюсь заставить его работать, но возникают проблемы, глянь сюда

Armance 08.12.2011 14:01

astrocybernaute, Svg Rendering Engine мне не подходит. У меня такая же ошибка, как и у вас.

Frank Hale 14.12.2011 02:08

@astrocybernaute Пожалуйста, постарайтесь соблюдать минимум грамматики.

Camilo Martin 15.12.2011 09:17

Я пробовал github.com/vvvv/SVG, и он работает, но с некоторыми ограничениями. Элемент image не реализован - я проверил исходный код. @FrankHale Мне пришлось удалить xmlns из svg, потому что Рафаэль добавил его дважды.

fireydude 30.10.2013 14:24

Некоторые отзывы: 1. inkscape хорошо работает с моими 30 тестовыми изображениями, результат правильный. Но очень медленно, на Core i7-3520M занимает 248 секунд. 2. github.com/vvvv/SVG версии 1.7, дает неверный результат, не пробуйте codeplex.com/svg. Кроме того, я также пробовал SharpVectorGraphics.0.3, тестирую один файл, не может правильно обрабатывать шрифт.

zhaorufei 15.06.2015 09:31

+ Я только что попробовал CoolUtils "Total CAD converter" версии 3.1.56 с одним файлом svg, дал неверный результат.

zhaorufei 15.06.2015 10:35

Inkscape ненадежен, медленен, не поддерживает многопоточность и не обязательно правильно обрабатывает стили CSS. Вместо этого взгляните на headless-chrome, chrome-debugging API и C# API для chrome-debugging API: github.com/ststeiger/ChromeDevTools/blob/master/source/…

Stefan Steiger 05.09.2019 09:59

Не работает на Linux

Deivydas Voroneckis 11.02.2020 15:26

Я использую для этого Батик. Полный код Delphi:

procedure ExecNewProcess(ProgramName : String; Wait: Boolean);
var
  StartInfo : TStartupInfo;
  ProcInfo : TProcessInformation;
  CreateOK : Boolean;
begin
  FillChar(StartInfo, SizeOf(TStartupInfo), #0);
  FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
  StartInfo.cb := SizeOf(TStartupInfo);
  CreateOK := CreateProcess(nil, PChar(ProgramName), nil, nil, False,
              CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS,
              nil, nil, StartInfo, ProcInfo);
  if CreateOK then begin
    //may or may not be needed. Usually wait for child processes
    if Wait then
      WaitForSingleObject(ProcInfo.hProcess, INFINITE);
  end else
    ShowMessage('Unable to run ' + ProgramName);

  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);
end;

procedure ConvertSVGtoPNG(aFilename: String);
const
  ExecLine = 'c:\windows\system32\java.exe -jar C:\Apps\batik-1.7\batik-rasterizer.jar ';
begin
  ExecNewProcess(ExecLine + aFilename, True);
end;

@downvoters - Объясните, почему вы проголосовали против. Голос против без объяснения причин имеет нулевую ценность.

stevenvh 19.09.2016 13:11

я предполагаю, что отрицательные голоса исходят из текста вопроса, который содержит в нем "C#". и ваше предложение - delphi

Denis 20.09.2017 16:56

не голосовал против, но вы могли отредактировать свой ответ и прояснить, что Batik - это библиотека Java, которую вы можете вызывать из C# или любого другого языка (в этом случае вы показали, как вызывать ее в Delphi)

ErrCode 23.08.2018 20:16

Запуск нового процесса идет медленно. И как правильно растрировать батик? Последние бинарные файлы получить сложно. Вместо того, чтобы мириться с этой чушью, взгляните на headless-chrome, chrome-debugging API и C# API для chrome-debugging API: github.com/ststeiger/ChromeDevTools/blob/master/source/… - Для всех пользователей Java, я уверен, что есть также Java-API. API отладки chrome.

Stefan Steiger 05.09.2019 10:06

вы можете использовать altsoft xml2pdf lib для этого

Когда мне пришлось растрировать svgs на сервере, я в конечном итоге использовал P / Invoke для вызова функций librsvg (вы можете получить библиотеки DLL из версии программы редактирования изображений GIMP для Windows).

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool SetDllDirectory(string pathname);

[DllImport("libgobject-2.0-0.dll", SetLastError = true)]
static extern void g_type_init(); 

[DllImport("librsvg-2-2.dll", SetLastError = true)]
static extern IntPtr rsvg_pixbuf_from_file_at_size(string file_name, int width, int height, out IntPtr error);

[DllImport("libgdk_pixbuf-2.0-0.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
static extern bool gdk_pixbuf_save(IntPtr pixbuf, string filename, string type, out IntPtr error, __arglist);

public static void RasterizeSvg(string inputFileName, string outputFileName)
{
    bool callSuccessful = SetDllDirectory("C:\Program Files\GIMP-2.0\bin");
    if (!callSuccessful)
    {
        throw new Exception("Could not set DLL directory");
    }
    g_type_init();
    IntPtr error;
    IntPtr result = rsvg_pixbuf_from_file_at_size(inputFileName, -1, -1, out error);
    if (error != IntPtr.Zero)
    {
        throw new Exception(Marshal.ReadInt32(error).ToString());
    }
    callSuccessful = gdk_pixbuf_save(result, outputFileName, "png", out error, __arglist(null));
    if (!callSuccessful)
    {
        throw new Exception(error.ToInt32().ToString());
    }
}

librSVG неплохой, но шрифты / текст не обрабатывает их правильно. Вместо этого взгляните на headless-chrome, chrome-debugging API и C# API для chrome-debugging API: github.com/ststeiger/ChromeDevTools/blob/master/source/…

Stefan Steiger 05.09.2019 10:04

Есть гораздо более простой способ использовать библиотеку http://svg.codeplex.com/ (более новая версия @ GIT, @ NuGet). Вот мой код

var byteArray = Encoding.ASCII.GetBytes(svgFileContents);
using (var stream = new MemoryStream(byteArray))
{
    var svgDocument = SvgDocument.Open(stream);
    var bitmap = svgDocument.Draw();
    bitmap.Save(path, ImageFormat.Png);
}

Мне пришлось использовать версию на github, потому что она более актуальна и даже не поддерживает элемент image.

fireydude 30.10.2013 14:26

Я использую этот код, он выдает object not set to an instance of an object, когда вы хотите выполнить var bitmap = svgDocument.Draw();. в чем проблема?

Rasool Ghafari 22.04.2015 23:53

@RasoolGhafari убедитесь, что ваш svgDocument не равен нулю.

Anish 23.04.2015 17:02

svgDocument не имеет значения NULL. Это какая-то внутренняя проблема в библиотеке.

Jonathan Allen 23.07.2015 05:56

@JonathanAllen, я отвечал на комментарий Расула.

Anish 23.07.2015 16:45

Да, но со мной происходит то же самое. Кажется, это недостаток в том, как он обрабатывает файлы SVG, которые он не может полностью отобразить.

Jonathan Allen 23.07.2015 21:38

vvvv / SVG неправильно обрабатывает стили CSS. Шрифты тоже неверные. Вместо этого взгляните на headless-chrome, chrome-debugging API и C# API для chrome-debugging API: github.com/ststeiger/ChromeDevTools/blob/master/source/…

Stefan Steiger 05.09.2019 10:03

Не работает на Linux

Deivydas Voroneckis 11.02.2020 15:26

У меня это отлично сработало в приложении Win64 .Net Core, размещенном в Azure.

Joshcodes 06.04.2020 16:42

Чтобы добавить к ответу от @Anish, если у вас возникли проблемы с отсутствием текста при экспорте SVG в изображение, вы можете создать рекурсивную функцию для циклического перебора дочерних элементов SVGDocument, попробуйте преобразовать ее в SvgText, если возможно (добавьте свою собственную проверку ошибок) и установите семейство шрифтов и стиль.

    foreach(var child in svgDocument.Children)
    {
        SetFont(child);
    }

    public void SetFont(SvgElement element)
    {
        foreach(var child in element.Children)
        {
            SetFont(child); //Call this function again with the child, this will loop
                            //until the element has no more children
        }

        try
        {
            var svgText = (SvgText)parent; //try to cast the element as a SvgText
                                           //if it succeeds you can modify the font

            svgText.Font = new Font("Arial", 12.0f);
            svgText.FontSize = new SvgUnit(12.0f);
        }
        catch
        {

        }
    }

Сообщите мне, если возникнут вопросы.

parent не определен в SetFont, должен быть element или переименовать переменную элемента в parent в сигнатуре функции

Norbert Kardos 08.01.2019 13:11

Также шрифт теперь кажется строкой. Однако это была палочка-выручалочка, спасибо!

Norbert Kardos 08.01.2019 13:27

Другие вопросы по теме