আমি খুব বেশি কোড না লিখে সি # ব্যবহার করে এসভিজি চিত্রগুলি পিএনজিতে রূপান্তর করার চেষ্টা করছি। কেউ কি এটি করার জন্য একটি লাইব্রেরি বা উদাহরণ কোডের প্রস্তাব দিতে পারেন?
আমি খুব বেশি কোড না লিখে সি # ব্যবহার করে এসভিজি চিত্রগুলি পিএনজিতে রূপান্তর করার চেষ্টা করছি। কেউ কি এটি করার জন্য একটি লাইব্রেরি বা উদাহরণ কোডের প্রস্তাব দিতে পারেন?
উত্তর:
এটি করতে আপনি ইনস্কেপের কমান্ড-লাইন সংস্করণটি কল করতে পারেন:
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
image
উপাদান বাস্তবায়িত হয় নি - আমি সোর্স কোড চেক। @ ফ্র্যাঙ্কহেল আমাকে এসভিজি থেকে একটি এক্সএমএলএনস সরিয়ে ফেলতে হয়েছিল কারণ রাফেল এটি দুটিবার যুক্ত করেছে।
লাইব্রেরিটি 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);
}
image
উপাদানটিকে সমর্থন করে না ।
object not set to an instance of an object
কার্যকর করতে চাইলে এটি ছুড়ে দেয় var bitmap = svgDocument.Draw();
। সমস্যা কি?
যখন আমাকে সার্ভারে এস.জে.জি.কে রাস্টেরাইজ করতে হয়েছিল, তখন আমি পি / ইনভোক ব্যবহার করে লাইবারসভিগ ফাংশনগুলি কল করতে শেষ করেছিলাম (আপনি জিম্প ইমেজ সম্পাদনা প্রোগ্রামের উইন্ডোজ সংস্করণ থেকে ডেলস পেতে পারেন)।
[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());
}
}
আমি এর জন্য বাটিক ব্যবহার করছি । সম্পূর্ণ ডেলফি কোড:
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;
Batik
যে আপনি একটি জাভা লাইব্রেরি যা আপনি সি # বা যে কোনও ভাষা থেকে কল করতে পারেন (এই ক্ষেত্রে আপনি এটি
@ আনিশের প্রতিক্রিয়া যুক্ত করতে, যদি কোনও ছবিতে এসভিজি রফতানির সময় আপনার পাঠ্যটি না দেখার সমস্যা হয় তবে আপনি এসভিজি ডকুমেন্টের বাচ্চাদের মাধ্যমে লুপ করার জন্য একটি পুনরাবৃত্ত ফাংশন তৈরি করতে পারেন, যদি এটি কোনও এসভিজি টেক্সটে কাস্ট করার চেষ্টা করুন সম্ভব (আপনার নিজের ত্রুটি পরীক্ষা করা যুক্ত করুন) এবং ফন্ট পরিবার এবং স্টাইল সেট করুন।
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
{
}
}
যদি প্রশ্ন থাকে তবে আমাকে জানান।
আপনি এটির জন্য আল্টসফট এক্সএমএল 2 পিডিএফ লাইব ব্যবহার করতে পারেন