# # बंद का उपयोग करके SVG को PNG में बदलना


102

मैं बहुत ज्यादा कोड लिखने के बिना, # का उपयोग करके SVG छवियों को PNG में बदलने की कोशिश कर रहा हूं। क्या कोई ऐसा करने के लिए लाइब्रेरी या उदाहरण कोड सुझा सकता है?


मुझे एक अच्छी और सरल लाइब्रेरी मिली जिसे आप c # github.com/ElinamLLC/SharpVector में उपयोग कर सकते हैं , यह कई प्रकार के svg को bmp, jpeg या png में बदल सकती है
Mahdi

2
क्या मैं कह सकता हूं: वे समाधान खराब हैं, जिनमें wkhtml2pdf / wkhtml2image आदि शामिल हैं। SVG विनिर्देश जटिल और विकसित हो रहा है, इसलिए CSS- शैलियाँ हैं, और इसके शीर्ष पर, इसे ब्राउज़र में जैसा दिखना चाहिए। उदाहरण के लिए, wkhtml2X में फोंट के साथ बड़े पैमाने पर समस्याएं हैं, और अंदर वेबकिट इंजन अभी बहुत पुराना है। सौभाग्य से, एक समाधान है: क्रोम में हेडलेस-मोड है, और इसके डिबगिंग-एपीआई के साथ, आप हेडलेस-क्रोम ही से PNG-images और PDF प्राप्त कर सकते हैं, C # में MasterDevs / ChromeDevTools के साथ: उदाहरण: github.com/ststeiger/ChromeDevTools / बूँद / मास्टर / स्रोत /…
स्टीफन स्टीगर

जवाबों:


68

आप ऐसा करने के लिए कमांड लाइन के इनस्केप का संस्करण कह सकते हैं:

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

इसके अलावा C # SVG रेंडरिंग इंजन है, मुख्य रूप से SVG फ़ाइलों को कोडप्लेक्स पर वेब पर उपयोग करने की अनुमति देने के लिए डिज़ाइन किया गया है जो आपकी समस्या के अनुसार आपकी आवश्यकताओं के अनुरूप हो सकता है:

मूल परियोजना
http://www.codeplex.com/svg

फ़ॉर्क्स फ़िक्सेस और अधिक गतिविधि के साथ: (7/2013 जोड़ा गया)
https://github.com/vvvv/SVG


39
धन्यवाद एस्पो। मैंने वास्तव में लिखा है कि अक्सस्केप ब्लॉग पोस्ट! हालांकि यह "काम करता है", यह विशेष रूप से मजबूत समाधान नहीं है। मुझे कोडप्लेक्स प्रोजेक्ट पसंद है, हालांकि - मैं इसे एक रूप दूंगा। धन्यवाद।
१२:१६ बजे

9
कितना शर्मनाक है :) अच्छी बात शायद एसवीजी रेंडरिंग इंजन आपको मदद कर सकता है।
Espo

20
मैं इसे एक प्रशंसा के रूप में लेता हूं। मैंने पहले खुद को उद्धृत नहीं किया है!
१३:३० बजे

क्या तुमने svg प्रतिपादन इंजन की कोशिश की? आप उर समाधान plz साझा कर सकते हैं im इसे काम करने की कोशिश कर रहा है, लेकिन परेशानी हो रही है, यहाँ देखें
आयुध

1
मैंने github.com/vvvv/SVG की कोशिश की है और यह कुछ सीमाओं के साथ काम करता है। imageतत्व लागू नहीं किया गया है - मैं स्रोत कोड की जाँच की। @FrankHale मुझे svg से एक xmlns निकालना पड़ा क्योंकि राफेल ने इसे दो बार जोड़ा।
फायरडूड

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तत्व का समर्थन नहीं करता है।
फायरड्यूड

मैं इस कोड से प्रयोग किया जाता है, यह object not set to an instance of an objectजब निष्पादित करना चाहते हैं फेंकता है var bitmap = svgDocument.Draw();। समस्या क्या है?
रसूल गफ़री

@RasoolGhafari सुनिश्चित करें कि आपका svgDocument शून्य नहीं है।
अनीश

svgDocument शून्य नहीं है। यह पुस्तकालय में किसी प्रकार की आंतरिक समस्या है।
जोनाथन एलन

@JonathanAllen, मैं रसूल की टिप्पणी का जवाब दे रहा था।
अनीश

12

जब मुझे सर्वर पर svgs को रैस्टोर करना पड़ा, तो मैंने librsvg फ़ंक्शन को कॉल करने के लिए P / Invoke का उपयोग करके समाप्त किया (आप GIMP छवि संपादन प्रोग्राम के विंडोज़ संस्करण से 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 खराब नहीं है, लेकिन फोंट / पाठ, यह उन्हें सही ढंग से संभाल नहीं करता है। इसके बजाय, हेडलेस-क्रोम, क्रोम-डिबगिंग एपीआई और क्रोम-डीबगिंग एपीआई के लिए एक सी # एपीआई पर एक नज़र डालें: github.com/ststeiger/ChromeDevTools/blob/master/source/…
स्टीफन स्टीगर

8

मैं इसके लिए बाटिक का उपयोग कर रहा हूं । पूरा डेल्फी कोड:

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 - कृपया समझाएं कि आप क्यों कम कर रहे हैं। एक स्पष्टीकरण के बिना डाउनवोट का शून्य मान है।
स्टीवनव

4
मुझे लगता है कि डाउनवोट्स उस प्रश्न पाठ से आते हैं जिसमें "c #" होता है। और आपका प्रस्ताव डेल्फी है
डेनिस

डाउनवोट नहीं किया, लेकिन आप अपने उत्तर को संपादित कर सकते हैं और यह स्पष्ट Batikकर सकते हैं कि एक जावा लाइब्रेरी है जिसे आप C # या जो भी भाषा में कॉल कर सकते हैं (इस मामले में आपने इसे डेल्फी में कैसे कॉल किया जाए)
ErrCode

नई प्रक्रिया शुरू करना धीमा है। इसके अलावा, बैटिक कैसे सही ढंग से जुटाता है? नवीनतम बायनेरिज़ मिलना मुश्किल है। उस बकवास के साथ डालने के बजाय, हेडलेस-क्रोम, क्रोम-डिबगिंग एपीआई और क्रोम-डीबगिंग एपीआई के लिए C # API पर एक नज़र डालें: github.com/ststeiger/ChromeDevTools/blob/master/source/… - सभी के लिए जावा-उपयोगकर्ता, मुझे यकीन है कि क्रोम के डीबगिंग-एपीआई के आसपास जावा-एपीआई भी है।
स्टीफन स्टीगर

4

@ वार्निश से प्रतिक्रिया में जोड़ने के लिए, यदि आपके पास छवि को एसवीजी निर्यात करते समय पाठ को नहीं देखने के साथ समस्याएँ हैं, तो आप 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 में परिभाषित नहीं किया गया है, तत्व होना चाहिए या फ़ंक्शन हस्ताक्षर में माता-पिता को तत्व चर का नाम बदलना चाहिए
नॉर्बर्ट कर्दोस

इसके अलावा Font अब एक स्ट्रिंग लगता है। हालाँकि यह एक लाइफसेवर था, धन्यवाद!
नोर्बर्ट कर्दोस

-3

आप इसके लिए altsoft xml2pdf lib का उपयोग कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.