ডাব্লুপিএফ ইমেজ রিসোর্স


408

আমি বেশিরভাগ ওয়েব এবং কিছুটা উইন্ডোজ ফর্ম ব্যাকগ্রাউন্ড থেকে এসেছি। একটি নতুন প্রকল্পের জন্য, আমরা ডাব্লুপিএফ ব্যবহার করব। ডাব্লুপিএফ অ্যাপ্লিকেশনটির 10 থেকে 20 ছোট আইকন এবং চিত্রের প্রয়োজন হবে উদাহরণস্বরূপ। আমি এম্বেডড রিসোর্স হিসাবে এগুলি সমাবেশে সঞ্চয় করার বিষয়ে ভাবছি। এটাই কি সঠিক পথ?

এক্সএএমএল-এ আমি কীভাবে উল্লেখ করব যে একটি চিত্র নিয়ন্ত্রণ একটি এম্বেড থাকা উত্স থেকে চিত্রটি লোড করে?

উত্তর:


473

আপনি যদি একাধিক স্থানে চিত্রটি ব্যবহার করেন তবে কেবল একবার মেমরির মধ্যে ইমেজ ডেটা লোড করা এবং তারপরে এটি সমস্ত Imageউপাদানগুলির মধ্যে ভাগ করে নেওয়া উপযুক্ত ।

এটি করতে, BitmapSource কোথাও একটি উত্স হিসাবে একটি তৈরি করুন :

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

তারপরে, আপনার কোডে, এর মতো কিছু ব্যবহার করুন:

<Image Source="{StaticResource MyImageSource}" />

আমার ক্ষেত্রে, আমি দেখতে পেয়েছি যে আমাকে ন্যায়বিচারের চেয়ে Image.pngবিল্ড অ্যাকশন রাখতে ফাইলটি সেট করতে হয়েছিল । এটি আপনার সঙ্কলিত সমাবেশের মধ্যে চিত্র বহন করে।ResourceContent


6
এটি কি গতিশীলভাবে করা সম্ভব হবে? আমি যদি স্টার্ট-আপে লোড করতে চাই এমন একটি পৃথক সংখ্যক চিত্র পাই তবে আমি কি প্রতি চিত্র বিটম্যাপ উত্স তৈরি করতে এবং তাদের উপরের মতো একইভাবে উল্লেখ করতে পারি?
বেকি ফ্র্যাঙ্কলিন

2
@ বেকি - হ্যাঁ আপনি করতে পারেন, যদিও আপনি যদি এগুলিকে Xaml এ উল্লেখ করতে চান তবে আপনার DynamicResourceপরিবর্তে মার্কআপ এক্সটেনশনটি ব্যবহার করার প্রয়োজন হতে পারে StaticResource, ধরে নিয়েছিলেন যে কম্পাইল করার সময় আপনি কীগুলি জানতে পারবেন। ডাব্লুপিএফ-এ আপনি রানটাইমে রিসোর্স অভিধান তৈরি করতে পারেন। বাস্তবে, আপনি যখন Xaml ডকুমেন্টটি লোড করেন তখনই এটি ঘটে থাকে, এটি ঠিক যে আপনি সমতুল্য সি # দেখতে পাচ্ছেন না।
ড্রয় নোকস

9
আমি যা আঘাত করেছি তার কিছু: আপনি যদি কোনও চিত্র সংস্থানটিতে আপনার চিত্রের সংস্থান যোগ করেন তবে আপনার উপাদানটির জন্য এক্সএএমএল -তে সেই চিত্র অভিধানটি উল্লেখ করতে ভুলবেন না। এর মতো কিছু: <ইউজারকন্ট্রোল.সম্পদ> <রিসোর্স অভিধান> <রিসোর্স ডিকোরিয়ালিটিস> মার্জড ডিকোরিয়ান্স> <রিসোর্স ডিকোরিয়াস সোর্স = "ডিকশনারি ১.এক্স্যামেল" /> </ রিসোর্সড অভিধান.মর্জেডডিকোরিজ> </ রিসোর্সড অভিধান> </ ইউজারকন্ট্রোল.সোর্সেস>
ড্যান মিশেল

4
আমি সাধারণত যুক্ত Width="{Binding Source.PixelWidth, RelativeSource={RelativeSource Self}}" করে থাকি Image, অন্যথায় আমি প্রায়শই দেখতে পাই যে চিত্রগুলি কোনও কারণে উদ্বেগজনকভাবে ছোট আকারের হয়ে উঠছে (যেমন 16x16 আইকন এমন কিছুতে প্রসারিত যা 200x200 পিক্সেলের মতো দেখায়)।
বা ম্যাপার

5
আমি খুঁজে পেয়েছি যে যদি বিটম্যাপেমেজটি কোনও রেফারেন্সড অ্যাসেমব্লির রিসোর্সোরিও অভিধানে ঘোষিত হয় তবে এটি কাজ করার জন্য ইউরিসোর্সটি একটি প্যাকউরি হওয়া দরকার। অন্যথায়, আপনি দেখতে পাবেন যে আপনি ভিএস-তে আপনার এক্সএএমএল সম্পাদকটিতে চিত্রটি দেখতে পাচ্ছেন তবে ডিবাগ করার সময় কোনও চিত্র নেই। প্যাক URI: msdn.microsoft.com/en-au/library/aa970069(v=vs.100).aspx
failedprogramming

174

আমি ইমেজ, ভিডিও ইত্যাদি ব্যবহারের সর্বোত্তম অনুশীলন বলে মনে করি:

  • আপনার ফাইল পরিবর্তন করুন "ক্রিয়ার বিল্ড" থেকে "সামগ্রী"ডিরেক্টরি নির্মাণের জন্য অনুলিপি চেক করতে ভুলবেন না ।
    • সমাধান এক্সপ্লোরার উইন্ডোতে "ডান ক্লিক" মেনুতে পাওয়া যায়।
  • নিম্নলিখিত বিন্যাসে চিত্র উত্স :
    • "/ « আপনারঅ্যাসবেশন নাম » ; উপাদান / « আপনারপথ » / « আপনারআইমেজ.পিএনজি » "

উদাহরণ

<Image Source="/WPFApplication;component/Images/Start.png" />

উপকারিতা:

  • ফাইলগুলি সমাবেশে এম্বেড করা হয় না।
    • রিসোর্স ম্যানেজার অনেক রিসোর্স (বিল্ড টাইম) এর সাথে কিছু মেমরি ওভারফ্লো সমস্যা উত্থাপন করবে।
  • সমাবেশগুলির মধ্যে বলা যেতে পারে।

36
আপনি যদি সমাবেশে সংস্থানটি এম্বেড করেন তবে এই একই পদ্ধতির কাজ করে তবে আপনাকে "বিল্ড অ্যাকশন" "রিসোর্স" এ সেট করতে হবে।
অ্যাশলে ডেভিস

5
ধন্যবাদ, ধন্যবাদ অন্যদের জন্য একটি নোট: "উপাদান" যেমন "প্রয়োজন তেমন", "চিত্রগুলি" প্রকল্পের পিএনজি-এর একটি আপেক্ষিক পথ। মূল চিত্রটিতে থাকা চিত্রটি হবে "<চিত্র উত্স =" / ডাব্লুপিএফ অ্যাপ্লিকেশন; উপাদান / সূচনা.পিএনজি "/>"
বদিবয়

3
সি # তে এটি কীভাবে করা যায় তার একটি উদাহরণ চমৎকার হবে। (এটি কোনও বৈধ ইউআরআই নয় তাই বিটম্যাপাইজেশন নির্মাণের সময় এটি ব্যবহার করা যাবে না))
ভ্যাকানকো

5
সুতরাং, ফাইলটি এম্বেড রিসোর্সে সেট করা থাকলে আপনি এটি কীভাবে করবেন? এটি কাজ করে না বলে মনে হচ্ছে। এবং আমি আমার প্রকল্পে ছবিটি দুইবার অন্তর্ভুক্ত করতে চাই না। (আমি ইতিমধ্যে এটি এম্বেডেড রিসোর্স হিসাবে ব্যবহার করছি))
ব্রেইনস্লাগস 83

2
কোথায় এবং কীভাবে "উপাদান" পথে আসে। এটি কিছু নির্দিষ্টকরণের অংশ?
ট্রায়ঙ্কো

46

কিছু লোক কোডে এটি করার বিষয়ে এবং উত্তর না পাওয়ার বিষয়ে জিজ্ঞাসা করছেন।

অনেক ঘন্টা অনুসন্ধানের পরেও আমি একটি খুব সহজ পদ্ধতি খুঁজে পেয়েছি, এর কোনও উদাহরণ পাইনি এবং তাই আমি এখানে আমার ভাগ করে নিয়েছি যা চিত্রগুলির সাথে কাজ করে। (আমার একটি .gif ছিল)

সারসংক্ষেপ:

এটি একটি বিটম্যাপ ফ্রেম প্রদান করে যা চিত্রসোর্সটি "গন্তব্যগুলি" পছন্দ করে।

ব্যবহার করুন:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

পদ্ধতি:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

শিক্ষা:

আমার অভিজ্ঞতাগুলি থেকে প্যাক স্ট্রিংটি সমস্যা নয়, আপনার স্ট্রিমগুলি পরীক্ষা করুন এবং বিশেষত যদি এটি প্রথমবার পড়তে হয় তবে ফাইলটির শেষের দিকে পয়েন্টার সেট করা হয়েছে এবং আপনাকে আবার পড়ার আগে আপনাকে এটি শূন্যে পুনরায় সেট করতে হবে।

আমি আশা করি এটি আমার জন্য এই টুকরোটি রাখার অনেক ঘন্টা বাঁচায়!


44

এক্সিকিউটিভ অ্যাসেমব্লিতে একটি সংস্থান লোড করার কোডে যেখানে আমার চিত্রটি Freq.pngফোল্ডারে ছিল এবং এটি Iconsসংজ্ঞায়িত হয়েছে Resource:

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

আমি একটি ফাংশনও করেছি:

/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
    if (assembly == null)
    {
        assembly = Assembly.GetCallingAssembly();
    }

    if (pathInApplication[0] == '/')
    {
        pathInApplication = pathInApplication.Substring(1);
    }
    return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); 
}

ব্যবহার (অনুমান আপনি ফাংশনটি রিসোর্সহেল্পার ক্লাসে রেখেছেন):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

দ্রষ্টব্য : ডাব্লুপিএফ-তে এমএসডিএন প্যাক ইউআরআই দেখুন :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml


নতুন উরি অবৈধ ইউআরআই নিক্ষেপ করে: অবৈধ পোর্ট নির্দিষ্ট।
স্টিভ

আপনার কি আপত্তিজনক ইউরি আছে?
এরিক ওয়েললেট

1
আপনার মত একই ইউরি বাদে আমার একটি উইনফর্ম হোস্ট করা ডাব্লুপিএফের ভিতরে চলছে। এবং নতুন প্যাকেজটি ডাকার সময় "প্যাক" স্কিমাটি এখনও নিবন্ধভুক্ত হয়নি।
স্টিভ

1
ওহো ... সম্ভবত এটি উইনফর্ম হোস্ট করা ডাব্লুপিএফ-এ ফিরে এসেছে। আমি দুঃখিত. আমি এটি ঠিক করার চেষ্টা করব না কারণ আমি মনে করি এটি খুব সাধারণ ব্যবহার নয়। শুভকামনা!
এরিক ওয়েললেট

আমার ক্ষেত্রে, new Uri(@"pack://application:,,,/" + pathInApplication)ব্যবহারটিও কৌশলটি করেছে।
অ্যাডাম কালভেট বোহল

40

হ্যাঁ, এটি সঠিক উপায়।

আপনি কেবল পথটি ব্যবহার করে রিসোর্স ফাইলে চিত্রটি ব্যবহার করতে পারেন:

<Image Source="..\Media\Image.png" />

আপনার অবশ্যই ইমেজ ফাইলটির বিল্ড অ্যাকশনটি "রিসোর্স" এ সেট করতে হবে।


1
এর জন্য ধন্যবাদ. কোনও ইমেজসোর্সের সাথে অনুরূপ কিছু করার কোনও উপায় আছে, মূলত একবার উত্স অভিধানে ইমেজটি লোড করা। আমি আশঙ্কা করি যে এই পদ্ধতির ফলে মেমরিতে একাধিকবার চিত্রের ডেটা লোড হয়।
ড্রয় নোকস 14

2
আপনার কোডটি রিফ্যাক্টর করার সময় এটি একটি বিশৃঙ্খলা হবে। আপনার এক্সএএমএল ডকুমেন্টের নাম স্থান পরিবর্তন করতে গেলে আপনাকে নিজে সমস্ত চিত্রের রেফারেন্স পরিবর্তন করতে হবে। ড্রু নোকস দ্বারা বর্ণিত পদ্ধতিটি অনেক মসৃণ এবং রক্ষণাবেক্ষণযোগ্য।
ক্যাস্পার হোল্ডাম

14

কীভাবে সম্পদগুলি ব্যবহার করবেন সে সম্পর্কে সম্পূর্ণ বিবরণ: ডাব্লুপিএফ অ্যাপ্লিকেশন রিসোর্স, সামগ্রী এবং ডেটা ফাইল

এবং কীভাবে সেগুলি উল্লেখ করবেন, "ডাব্লুপিএফ-তে প্যাক ইউআরআই" পড়ুন।

সংক্ষেপে, রেফারেন্সিং / রেফারেন্সিং অ্যাসেম্বলিগুলি থেকে সংস্থানসমূহের রেফারেন্সের এমনকি উপায়ও রয়েছে।


লিঙ্কটি লাইভ এবং ভাল বলে মনে হচ্ছে (যদিও এটি বলে যে "এই নথিটি সংরক্ষণাগারভুক্ত এবং রক্ষণাবেক্ষণ করা হচ্ছে না।" )।
পিটার মর্টেনসেন

5
  1. ভিজ্যুয়াল স্টুডিও 2010 পেশাদার এসপি 1।
  2. .NET ফ্রেমওয়ার্ক 4 ক্লায়েন্ট প্রোফাইল।
  3. পিএনজি চিত্রটি প্রকল্পের বৈশিষ্ট্যগুলিতে সংস্থান হিসাবে যুক্ত হয়েছে।
  4. রিসোর্স ফোল্ডারে নতুন ফাইল স্বয়ংক্রিয়ভাবে তৈরি হয়েছে।
  5. সম্পদের জন্য অ্যাকশন সেট সেট করুন।

এটি আমার পক্ষে কাজ করেছে:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />

3

যদি আপনি মিশ্রণটি ব্যবহার করেন তবে এটি অতিরিক্ত সহজ করার জন্য এবং উত্স বৈশিষ্ট্যের সঠিক পথটি পেতে কোনও সমস্যা না হওয়ার জন্য , কেবল প্রজেক্ট প্যানেল থেকে চিত্রটি ডিজাইনারের উপরে টানুন এবং ড্রপ করুন।


3

হ্যাঁ, এটি সঠিক উপায়। আপনি কোনও পাথ ব্যবহার করে রিসোর্স ফাইলে চিত্রগুলি ব্যবহার করতে পারেন:

<StackPanel Orientation="Horizontal">
    <CheckBox  Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
    <Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
    <TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>

-5

নিম্নলিখিত কাজ করা এবং সেট করা ইমেজগুলি হ'ল বৈশিষ্ট্যগুলির রিসোর্স:

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;

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