সি # [বদ্ধ] ব্যবহার করে এসভিজিটিকে পিএনজিতে রূপান্তর করা


104

আমি খুব বেশি কোড না লিখে সি # ব্যবহার করে এসভিজি চিত্রগুলি পিএনজিতে রূপান্তর করার চেষ্টা করছি। কেউ কি এটি করার জন্য একটি লাইব্রেরি বা উদাহরণ কোডের প্রস্তাব দিতে পারেন?


4
আমি একটি ভাল এবং সাধারণ লাইব্রেরি পেয়েছি যা আপনি সি # github.com/ElinamLLC/SharpVectors এ ব্যবহার করতে পারেন , এটি অনেক ধরণের svg কে bmp, jpeg বা png- এ রূপান্তর করতে পারে
মাহদি

4
আমি বলতে পারি: সেগুলি সমাধানগুলি খারাপ, ডাব্লুএইচটিএমএল 2 পিডিডিএফ / ডাব্লুএইচটিএমটি 2 ইমেজ সহ The উদাহরণস্বরূপ, ডাব্লুএইচটিএমএল 2 এক্সের ফন্টগুলির সাথে বিশাল সমস্যা রয়েছে এবং ওয়েবকিট ইঞ্জিনটি ভিতরে খুব পুরানো। ভাগ্যক্রমে, একটি সমাধান রয়েছে: ক্রোমের হেডলেস-মোড রয়েছে এবং এর ডিবাগিং-এপিআইয়ের সাহায্যে আপনি হেডলেস-ক্রোম নিজে থেকেই পিএনজি-চিত্রগুলি এবং পিডিএফগুলি পেতে পারেন, সি # তে মাস্টারডেভস / ক্রোমডেভটুলগুলি সহ: উদাহরণ: github.com/ststeiger/ChromeDevTools / ব্লব / মাস্টার / উত্স /…
স্টিফান স্টেইগার

উত্তর:


69

এটি করতে আপনি ইনস্কেপের কমান্ড-লাইন সংস্করণটি কল করতে পারেন:

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

এছাড়াও একটি সি # এসভিজি রেন্ডারিং ইঞ্জিন রয়েছে, প্রাথমিকভাবে কোডেপ্লেক্সে ওয়েবে এসভিজি ফাইলগুলি ব্যবহার করার অনুমতি দেওয়ার জন্য ডিজাইন করা হয়েছে যা যদি আপনার সমস্যা হয় তবে এটি আপনার প্রয়োজন অনুসারে করতে পারে:

আসল প্রকল্প
http://www.codeplex.com/svg

সংশোধন এবং আরও ক্রিয়াকলাপ সহ কাঁটা : (7/2013 যোগ করা হয়েছে)
https://github.com/vvvv/SVG


39
ধন্যবাদ এসপো আমি আসলে লিখেছিলাম যে ইনস্কেপ ব্লগ পোস্ট! যদিও এটি "কাজ করে", এটি কোনও বিশেষ দৃust় সমাধান নয়। আমি কোডেপ্লেক্স প্রকল্পটি পছন্দ করি যদিও - আমি এটির চেহারা দেব। ধন্যবাদ
হ্যারিয়ট

9
কত বিব্রতকর :) ভাল জিনিস সম্ভবত এসভিজি রেন্ডারিং ইঞ্জিন আপনাকে সাহায্য করতে পারে।
এপো

21
আমি একটি প্রশংসা হিসাবে এটি গ্রহণ করা। আমি আমার আগে উদ্ধৃত করা হয়নি!
হারিওট

আপনি এসভিজি রেন্ডারিং ইঞ্জিন চেষ্টা করেছেন? আপনি কি আপনার সমাধান plz ভাগ করতে পারেন? আমি এটি কাজ করার চেষ্টা করছি কিন্তু সমস্যা হচ্ছে, এখানে দেখুন
আর্মানেন্স

4
আমি github.com/vvvv/SVG চেষ্টা করেছি এবং এটি নির্দিষ্ট সীমাবদ্ধতার সাথে কাজ করে। imageউপাদান বাস্তবায়িত হয় নি - আমি সোর্স কোড চেক। @ ফ্র্যাঙ্কহেল আমাকে এসভিজি থেকে একটি এক্সএমএলএনস সরিয়ে ফেলতে হয়েছিল কারণ রাফেল এটি দুটিবার যুক্ত করেছে।
ফায়ারডুড

76

লাইব্রেরিটি http://svg.codeplex.com/ (নতুন সংস্করণ @ জিআইটি , @ নিউজিট ) ব্যবহার করার অনেক সহজ উপায় রয়েছে । এখানে আমার কোড

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

4
আমাকে গিথুব সংস্করণটি ব্যবহার করতে হয়েছিল কারণ এটি আরও বেশি আপ টু ডেট এবং এমনকি এটি imageউপাদানটিকে সমর্থন করে না ।
ফায়ারডুড

আমি এই কোডটি থেকে ব্যবহার করেছি, object not set to an instance of an objectকার্যকর করতে চাইলে এটি ছুড়ে দেয় var bitmap = svgDocument.Draw();। সমস্যা কি?
রসুল গাফারী

@ রসুলগাফারি নিশ্চিত করুন যে আপনার এসভিজি ডকুমেন্টটি বাতিল নয়।
আনিস

svgDocament নাল নয়। এটি লাইব্রেরিতে এক ধরণের অভ্যন্তরীণ সমস্যা।
জোনাথন অ্যালেন

@ জোনাথন অ্যালেন, আমি রসুলের মন্তব্যের জবাব দিচ্ছিলাম।
আনিস

12

যখন আমাকে সার্ভারে এস.জে.জি.কে রাস্টেরাইজ করতে হয়েছিল, তখন আমি পি / ইনভোক ব্যবহার করে লাইবারসভিগ ফাংশনগুলি কল করতে শেষ করেছিলাম (আপনি জিম্প ইমেজ সম্পাদনা প্রোগ্রামের উইন্ডোজ সংস্করণ থেকে ডেলস পেতে পারেন)।

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

4
librSVG খারাপ নয়, তবে ফন্ট / পাঠ্য, এটি তাদের সঠিকভাবে পরিচালনা করে না। পরিবর্তে, হেডলেস-ক্রোম, ক্রোম-ডিবাগিং এপিআই, এবং ক্রোম-ডিবাগিং এপিআইয়ের জন্য একটি সি # API দেখুন: 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;

@ ডাউনভোটার্স - আপনি কেন কম অনুগ্রহ করে দয়া করে তা ব্যাখ্যা করুন। কোনও ব্যাখ্যা ছাড়াই একটি ডাউনভোটের শূন্য মান রয়েছে।
স্টিভেনভ

4
আমি অনুমান করি যে ডাউনটিভোটগুলি প্রশ্নের পাঠ্য থেকে এসেছে যা এতে "সি #" রয়েছে। এবং আপনার প্রস্তাবটি ডেলফি
ডেনিস

কম করেনি, তবে আপনি নিজের উত্তরটি সম্পাদনা করতে এবং এটি পরিষ্কার করে দিতে পারেন Batikযে আপনি একটি জাভা লাইব্রেরি যা আপনি সি # বা যে কোনও ভাষা থেকে কল করতে পারেন (এই ক্ষেত্রে আপনি এটি
ডেলিফিতে

একটি নতুন প্রক্রিয়া শুরু করা ধীর। এছাড়াও, বাটিক কীভাবে সঠিকভাবে জন্মাতে পারে? সর্বশেষ বাইনারিগুলি পাওয়া শক্ত। সেই ছদ্মবেশটি সরিয়ে দেওয়ার পরিবর্তে, হেডলেস-ক্রোম, ক্রোম-ডিবাগিং এপিআই, এবং ক্রোম-ডিবাগিং এপিআইয়ের জন্য একটি সি # এপিআই দেখুন: github.com/ststeiger/ChromeDevTools/blob/master/source/… - সবার জন্য জাভা ব্যবহারকারীরা, আমি নিশ্চিত ক্রোমের ডিবাগিং-এপিআই-এর আশেপাশে জাভা-এপিআই-এরও রয়েছে।
স্টিফান স্টেইগার

4

@ আনিশের প্রতিক্রিয়া যুক্ত করতে, যদি কোনও ছবিতে এসভিজি রফতানির সময় আপনার পাঠ্যটি না দেখার সমস্যা হয় তবে আপনি এসভিজি ডকুমেন্টের বাচ্চাদের মাধ্যমে লুপ করার জন্য একটি পুনরাবৃত্ত ফাংশন তৈরি করতে পারেন, যদি এটি কোনও এসভিজি টেক্সটে কাস্ট করার চেষ্টা করুন সম্ভব (আপনার নিজের ত্রুটি পরীক্ষা করা যুক্ত করুন) এবং ফন্ট পরিবার এবং স্টাইল সেট করুন।

    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
        {

        }
    }

যদি প্রশ্ন থাকে তবে আমাকে জানান।


পিতামাতাকে সেটফন্টে সংজ্ঞায়িত করা হয়নি, ফাংশনের স্বাক্ষরে অভিভাবকের কাছে উপাদানটি পরিবর্তনশীল বা উপাদানটির পরিবর্তনশীল নামকরণ করা উচিত
নরবার্ট কার্ডোস

এছাড়াও হরফ এখন স্ট্রিং বলে মনে হচ্ছে। তবে এটি ছিল একটি জীবনদাতা, ধন্যবাদ!
নরবার্ট কার্ডোস

-4

আপনি এটির জন্য আল্টসফট এক্সএমএল 2 পিডিএফ লাইব ব্যবহার করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.