C #을 사용하여 SVG를 PNG로 변환 [닫기]


102

너무 많은 코드를 작성하지 않고도 C #을 사용하여 SVG 이미지를 PNG로 변환하려고했습니다. 누구든지이를 위해 라이브러리 나 예제 코드를 추천 할 수 있습니까?


c # github.com/ElinamLLC/SharpVectors 에서 사용할 수있는 훌륭하고 간단한 라이브러리를 찾았습니다. 많은 유형의 svg를 bmp, jpeg 또는 png로 변환 할 수 있습니다
Mahdi

2
wkhtml2pdf / wkhtml2image 등의 솔루션은 좋지 않습니다. SVG 사양은 복잡하고 진화하고 있으며 CSS 스타일도 마찬가지입니다. 게다가 브라우저에서와 동일하게 보일 것입니다. 예를 들어 wkhtml2X는 글꼴에 큰 문제가 있으며 내부의 웹킷 엔진은 너무 오래되었습니다. 다행히도 해결책이 있습니다. Chrome에는 헤드리스 모드가 있으며 디버깅 API를 사용하면 C #의 MasterDevs / ChromeDevTools를 사용하여 헤드리스 Chrome 자체에서 PNG 이미지 및 PDF를 가져올 수 있습니다. 예 : github.com/ststeiger/ChromeDevTools / blob / master / source /…
Stefan Steiger

답변:


68

이를 위해 inkscape의 명령 줄 버전을 호출 할 수 있습니다.

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

또한 C # SVG 렌더링 엔진이 있습니다. 주로 SVG 파일이 문제인 경우 필요에 맞는 codeplex의 웹에서 사용할 수 있도록 설계되었습니다.

원본 프로젝트
http://www.codeplex.com/svg

수정 사항 및 추가 활동이 포함 된 포크 : (2013 년 7 월 추가됨)
https://github.com/vvvv/SVG


39
감사합니다 Espo. 실제로 잉크 스케이프 블로그 게시물을 썼습니다! "작동"하지만 특별히 강력한 솔루션은 아닙니다. 나는 codeplex 프로젝트가 마음에 들었습니다. 감사.
harriyott

9
얼마나 당황 스러운지 :) 좋은 것은 아마도 SVG 렌더링 엔진이 당신을 도울 수있을 것입니다.
Espo

20
나는 그것을 칭찬으로 받아들입니다. 나는 전에 나 자신에게 인용 된 적이 없습니다!
harriyott

svg 렌더링 엔진을 사용해 보셨습니까? u ur 솔루션 plz를 공유 할 수 있습니다. , 문제를 작동 만들려고 노력하지만, 필요 메신저 여기를 참조하십시오
Armance

1
github.com/vvvv/SVG를 시도했지만 작동하지만 특정 제한이 있습니다. image요소가 구현되지 않았습니다 - 나는 소스 코드를 확인했습니다. @FrankHale raphael이 두 번 추가했기 때문에 svg에서 xmlns를 제거해야했습니다.
fireydude

74

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

1
github 버전이 더 최신이고 image요소를 지원하지 않기 때문에 사용해야했습니다 .
fireydude

나는이 코드에서 사용되며 object not set to an instance of an object실행할 때 발생 var bitmap = svgDocument.Draw();합니다. 뭐가 문제 야?
Rasool Ghafari 2015

@RasoolGhafari는 svgDocument가 null이 아닌지 확인하십시오.
Anish

svgDocument가 null이 아닙니다. 이것은 라이브러리의 내부 문제입니다.
Jonathan Allen

@JonathanAllen, Rasool의 의견에 대답했습니다.
Anish

12

서버에서 svg를 래스터 화해야했을 때 P / Invoke를 사용하여 librsvg 함수를 호출했습니다 (Windows 버전의 김프 이미지 편집 프로그램에서 dll을 가져올 수 있음).

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

1
librSVG는 나쁘지 않지만 글꼴 / 텍스트는 올바르게 처리하지 않습니다. 대신, 헤드리스 - 크롬, 크롬 디버깅 API를 살펴과 크롬 디버깅 API에 대한 C #을 API 걸릴 github.com/ststeiger/ChromeDevTools/blob/master/source/...
스테판 스타 이거

8

나는 이것을 위해 Batik 을 사용하고 있습니다. 완전한 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-왜 반대 투표를했는지 설명 해주세요. 설명이없는 반대표는 값이 0입니다.
stevenvh

4
나는 그 안에 "c #"이 포함 된 질문 텍스트에서 반대표가 나온 것 같다. 당신의 제안은 델파이입니다
데니스

반대표를 던지지는 않았지만 대답을 편집 Batik하고 C # 또는 다른 언어에서 호출 할 수있는 Java 라이브러리임을 명확히 할 수 있습니다 (이 경우에는 Delphi에서 호출하는 방법을 보여주었습니다)
ErrCode

새로운 프로세스를 시작하는 것은 느립니다. 또한 바틱은 얼마나 정확하게 래스터 화합니까? 최신 바이너리는 구하기 어렵습니다. 그 쓰레기를 참는 대신 headless-chrome, chrome-debugging API 및 chrome-debugging API 용 C # API를 살펴보세요 . github.com/ststeiger/ChromeDevTools/blob/master/source/…- 모두를 위해 자바 사용자 여러분, 크롬의 디버깅 API 주변에 자바 API도 있다고 확신합니다.
Stefan Steiger

4

@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
        {

        }
    }

질문이 있으면 알려주세요.


부모의 setFont이 정의되지 않으며, 소자 수 또는 기능 특성에 부모 요소 변수를 바꾸어야
베르트 Kardos

또한 글꼴은 이제 문자열 인 것 같습니다. 그러나 이것은 생명의 은인이었습니다. 감사합니다!
Norbert Kardos

-3

이를 위해 altsoft xml2pdf lib를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.