WPF छवि संसाधन


408

मैं ज्यादातर वेब और थोड़े से विंडोज फॉर्म बैकग्राउंड से आता हूं। एक नई परियोजना के लिए, हम WPF का उपयोग करेंगे। WPF आवेदन को 10 - 20 छोटे आइकनों और चित्रों की आवश्यकता होगी। मैं विधानसभा में इन संसाधनों के रूप में संग्रहीत करने के बारे में सोच रहा हूं। क्या यह जाने का सही तरीका है?

मैं एक्सएएमएल में कैसे निर्दिष्ट करूं कि एक छवि नियंत्रण को छवि को एक एम्बेडेड संसाधन से लोड करना चाहिए?

जवाबों:


473

यदि आप कई स्थानों पर छवि का उपयोग करेंगे, तो यह केवल स्मृति में छवि डेटा लोड करने और फिर सभी Imageतत्वों के बीच साझा करने के लायक है ।

ऐसा करने के लिए, BitmapSource कहीं एक संसाधन के रूप में बनाएं :

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

फिर, अपने कोड में, कुछ का उपयोग करें:

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

मेरे मामले में, मैंने पाया कि मुझे Image.pngफ़ाइल को सेट करने के लिए Resourceबस के बजाय एक बिल्ड एक्शन करना था Content। यह छवि को आपके संकलित असेंबली में ले जाने का कारण बनता है।


6
क्या यह गतिशील रूप से करना संभव होगा? अगर मेरे पास अलग-अलग संख्या में छवियां हैं, जो मैं स्टार्ट-अप पर लोड करना चाहूंगा, तो क्या मैं प्रति छवि एक बिटमैप स्रोत बना सकता हूं और उन्हें उसी तरह से ऊपर बता सकता हूं?
बेकी फ्रेंकलिन

2
@ बेकी - हां, आप कर सकते हैं, हालांकि अगर आप उन्हें एक्सलम में संदर्भित करना चाहते हैं तो आपको DynamicResourceइसके बजाय मार्कअप एक्सटेंशन का उपयोग करने की आवश्यकता हो सकती है StaticResource, यह मानते हुए कि आपको संकलन समय पर कुंजियों का पता चल जाएगा। WPF में आप रनटाइम पर संसाधन शब्दकोश बना सकते हैं। वास्तव में, ऐसा तब होता है जब आप एक Xaml दस्तावेज़ लोड करते हैं, यह सिर्फ इतना है कि आप बराबर C # नहीं देखते हैं।
ड्रू नोक

9
मैंने कुछ मारा: यदि आप अपने छवि संसाधन को एक संसाधन शब्दकोश में जोड़ते हैं, तो अपने घटक के लिए XAML में उस छवि शब्दकोश का उल्लेख करना न भूलें। कुछ इस तरह से: <UserControl.Resources> <रिसोर्सबार्ड> <रिसोर्सडाउन। डिअरडेज डिक्लेरेशन> <रिसोर्सबॉडी सोर्स = "Dictionary1.xaml" /> </ResourceDictionary.MergedD शब्दकोशों> </ संसाधन छायाकारक </UserControl.Resources>
Dan Mitchell

4
मैं आमतौर पर जोड़ने Width="{Binding Source.PixelWidth, RelativeSource={RelativeSource Self}}" के लिए Image(कुछ है कि 200x200 पिक्सल दिखेगा तक फैला जैसे 16x16 माउस), के रूप में अन्यथा मैं अक्सर देखते हैं छवियों हास्यास्पद रूप से किसी कारण से बढ़ाए गए हैं हो रही।
या मैपर

5
मैंने पाया कि यदि संदर्भित असेंबली की रीसोएरेडिटिक्स में BitmapImage घोषित किया जाता है, तो इसके लिए काम करने के लिए UriSource को एक packurI होना चाहिए। अन्यथा, आप पाएंगे कि आप अपने xaml संपादक में छवि को VS में देख सकते हैं लेकिन डिबगिंग करते समय कोई छवि नहीं। पैक URIS: msdn.microsoft.com/en-au/library/aa970069(v=vs.100).aspx
विफल

174

मैंने पाया कि चित्र, वीडियो आदि का उपयोग करने का सबसे अच्छा अभ्यास है:

  • अपनी फ़ाइलें "एक्शन बनाएँ" को "सामग्री" में बदलें । निर्देशिका बनाने के लिए प्रतिलिपि की जाँच करना सुनिश्चित करें ।
    • समाधान एक्सप्लोरर विंडो पर "राइट-क्लिक" मेनू पर मिला।
  • निम्नलिखित प्रारूप में छवि स्रोत :
    • "/ « YourAssemblyName » ; घटक /« YourPath »/ « YourImage.png » "

उदाहरण

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

लाभ:

  • फाइल असेंबली में एम्बेडेड नहीं हैं।
    • संसाधन प्रबंधक बहुत अधिक संसाधनों (बिल्ड समय पर) के साथ कुछ स्मृति अतिप्रवाह समस्याओं को बढ़ाएगा।
  • विधानसभाओं के बीच बुलाया जा सकता है।

36
यदि आप असेंबली में संसाधन एम्बेड करते हैं तो यह एक ही दृष्टिकोण काम करता है, लेकिन आपको "बिल्ड एक्शन" को "संसाधन" पर सेट करना होगा।
एशले डेविस

5
काम करता है, धन्यवाद। दूसरों के लिए एक नोट: "घटक" की आवश्यकता है "जैसा है", "छवियाँ" परियोजना में png का एक सापेक्ष पथ है। Ie छवि जो रूट में रखी गई है, वह "<Image Source =" / WPFApplication; घटक / Start.png "/>" होगी
Badiboy

3
सी # में ऐसा करने का एक उदाहरण अच्छा होगा। (यह एक वैध यूआरआई नहीं है, इसलिए
बिटमैप

5
यदि फ़ाइल एंबेडेड संसाधन पर सेट है तो आप इसे कैसे करते हैं? यह काम नहीं लगता है। और मैं अपनी परियोजना में दो बार छवि को शामिल नहीं करना चाहता। (मैं पहले से ही इसे एक एम्बेडेड संसाधन के रूप में उपयोग कर रहा हूं।)
ब्रेनस्ल्गस83

2
कहाँ और कैसे "घटक" पथ में आता है। क्या यह कुछ विनिर्देश का हिस्सा है?
त्रिनको 23

46

कुछ लोग कोड में ऐसा करने और जवाब नहीं मिलने के बारे में पूछ रहे हैं।

कई घंटों की खोज के बाद मैंने एक बहुत ही सरल तरीका खोजा, मुझे कोई उदाहरण नहीं मिला और इसलिए मैं यहां अपना हिस्सा देता हूं जो छवियों के साथ काम करता है। (मेरा एक .gif था)

सारांश:

यह एक बिटमैपफल प्रदान करता है जो ImageSource "गंतव्यों" को पसंद करता है।

उपयोग:

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

नोट : WPF में MSDN पैक URI देखें :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml


नया उड़ी अमान्य URI फेंकता है: निर्दिष्ट अवैध पोर्ट।
स्टीव

क्या आपके पास अपमानजनक यूरी है?
एरिक ओलेलेट

1
आपका उरई जैसा कि उस खदान को छोड़कर, एक WPF होस्ट किए गए विनफॉर्म के अंदर चल रहा था। और "पैक" स्कीमा तब पंजीकृत नहीं किया गया था जब मैंने नया उरी कहा था।
स्टीव

1
ओह ... यह शायद होस्ट किए गए WPF होस्ट किए गए winform को रेट किया गया है। मुझे माफ कर दो। मैं इसे ठीक करने की कोशिश नहीं करूंगा क्योंकि मुझे लगता है कि यह बहुत सामान्य उपयोग नहीं है। सौभाग्य!
एरिक ओउलेटलेट

मेरे मामले में, का उपयोग कर new Uri(@"pack://application:,,,/" + pathInApplication)भी चाल चली।
एडम कैल्वेट बोहल

40

हां, यह सही तरीका है।

आप पथ का उपयोग करके संसाधन फ़ाइल में छवि का उपयोग कर सकते हैं:

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

आपको इमेज फाइल की बिल्ड एक्शन को "रिसोर्स" पर सेट करना होगा।


1
इसके लिए धन्यवाद। क्या ImageSource के साथ कुछ ऐसा ही करने का एक तरीका है, अनिवार्य रूप से छवि को एक संसाधन शब्दकोश में लोड करना। मुझे डर है कि यह दृष्टिकोण मेमोरी में छवि डेटा को कई बार लोड करता है।
ड्रू नॉक

2
यह एक गड़बड़ होगी जब आपको अपने कोड को रिफलेक्टर करने की आवश्यकता होगी। यदि आपका xaml दस्तावेज़ नामस्थान बदलने के लिए होता है, तो आपको सभी छवि संदर्भों को मैन्युअल रूप से बदलना होगा। ड्रू नोक द्वारा वर्णित विधि बहुत चिकनी और मुख्य है।
कास्पर होल्डम

14

संसाधनों का उपयोग करने का पूर्ण विवरण: WPF अनुप्रयोग संसाधन, सामग्री और डेटा फ़ाइलें

और उन्हें कैसे संदर्भित करें, "WPF में पैक URI" पढ़ें।

संक्षेप में, संदर्भित / संदर्भित असेंबलियों से संसाधनों को संदर्भित करने के लिए भी साधन है।


लिंक लाइव और अच्छी तरह से प्रतीत होता है (हालांकि यह कहता है कि "यह प्रलेखन संग्रहीत है और इसका रखरखाव नहीं किया जा रहा है।" )।
पीटर मोर्टेंसन

5
  1. विजुअल स्टूडियो 2010 व्यावसायिक SP1।
  2. .NET फ्रेमवर्क 4 क्लाइंट प्रोफाइल।
  3. PNG छवि परियोजना गुणों पर संसाधन के रूप में जोड़ी गई।
  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
कोई अपराध नहीं है लेकिन यह बुरा अभ्यास की तरह बदबू आ रही है।
श्लोएमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.