C # में प्रोजेक्ट के संसाधन क्षेत्र से लोड छवि


212

मेरे पास संसाधन / myimage.jpg पर संग्रहीत मेरी परियोजना में एक छवि है। मैं इस छवि को गतिशील रूप से बिटमैप ऑब्जेक्ट में कैसे लोड कर सकता हूं?


1
इस उत्तर को देखें: stackoverflow.com/questions/94456/…
रोलाण्ड

यह एक ऐसा प्रश्न था जो बाद में पूछा गया था, लेकिन संबंधित है, यदि डुप्लिकेट नहीं है: stackoverflow.com/questions/13592150/load-image-from-resources
vapcguy

जवाबों:


242

क्या आप विंडोज फॉर्म का उपयोग कर रहे हैं? यदि आपने गुण / संसाधन UI का उपयोग करके छवि को जोड़ा है, तो आपको उत्पन्न कोड से छवि तक पहुंच प्राप्त होती है, इसलिए आप बस यह कर सकते हैं:

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);

नहीं, यह फ़ोल्डर संसाधन में एक सादे फ़ाइल के रूप में जोड़ा जाता है।
पावेल बस्तोव

9
आह अच्छा। उस स्थिति में मुझे लगता है कि @ हॉलग्रिम को संसाधन धाराओं का उपयोग करके आपके लिए जवाब मिल गया है। यदि आप विंडोज फॉर्म का उपयोग कर रहे हैं, तो मैं आपको छवि को हटाने और UI से इसे फिर से जोड़ने का आग्रह करूंगा - इस तरह से बहुत आसान।
मैट हैमिल्टन

114

आप निम्न तरीके से छवि का संदर्भ प्राप्त कर सकते हैं:

Image myImage = Resources.myImage;

यदि आप छवि की प्रतिलिपि बनाना चाहते हैं , तो आपको निम्नलिखित कार्य करने होंगे:

Bitmap bmp = new Bitmap(Resources.myImage);

जब आप इसके साथ कर लें तो bmp को निपटाना न भूलें । यदि आपको संकलन-समय पर संसाधन छवि का नाम नहीं पता है, तो आप संसाधन प्रबंधक का उपयोग कर सकते हैं:

ResourceManager rm = Resources.ResourceManager;
Bitmap myImage = (Bitmap)rm.GetObject("myImage");

रिसोर्स मैनजर का लाभ यह है कि आप इसका उपयोग कर सकते हैं जहाँ Resources.myImage सामान्य रूप से दायरे से बाहर होगा, या जहाँ आप संसाधनों को गतिशील रूप से एक्सेस करना चाहते हैं। इसके अतिरिक्त, यह ध्वनियों, कॉन्फिग फाइलों आदि के लिए काम करता है।


17
नोट: Properties.Resources.myImage का उपयोग करें;
14

मैं अपने डेटाग्रिड पर संसाधन ऑब्जेक्ट को बांधने का प्रयास कर रहा हूं लेकिन यह आपके तरीके का उपयोग नहीं कर रहा है। डेटाग्रिड छवि कॉलम को टेम्पलेट किया गया है।
alice7

70

आपको इसे संसाधन स्ट्रीम से लोड करने की आवश्यकता है।

Bitmap bmp = new Bitmap(
  System.Reflection.Assembly.GetEntryAssembly().
    GetManifestResourceStream("MyProject.Resources.myimage.png"));

यदि आप अपनी विधानसभा के सभी संसाधन नामों को जानना चाहते हैं, तो यहां जाएं:

string[] all = System.Reflection.Assembly.GetEntryAssembly().
  GetManifestResourceNames();

foreach (string one in all) {
    MessageBox.Show(one);
}

29
आपको प्रतिबिंब का उपयोग करने की आवश्यकता नहीं होनी चाहिए - यह सरल रूप से उपलब्ध सरल तरीकों को देखते हुए अत्यधिक जटिल लगता है।
चार्ली साल्ट

यह समाधान C # / Windows Phone .NETCF --GetManifestResourceNames () में केवल एक नाम, असेंबली-डीएलएल मॉड्यूल का काम नहीं करता है। प्रकट में केवल एक संसाधन उपलब्ध है - DLL मॉड्यूल की धारा बूँद। C ++ और असुरक्षित कोड के बिना आपको Win32 API कॉल करने की अनुमति देता है, यह स्पष्ट रूप से स्मृति के इस भाग के साथ काम करने के लिए गधा में एक शाही दर्द है।
मार्क जोंस

2
आप typeof(this).Assemblyशॉर्ट के लिए भी इस्तेमाल कर सकते हैं ।
श्री हर्ष चिलकपति

1
@ श्रीहरिश्चलाकपति typeof(this)काम नहीं करेंगे। this.GetType().Assemblyआपने जो कहा, उसके सबसे करीब है, लेकिन यह जोखिम भरा है क्योंकि यह एक विरासत वाले सुपरक्लास पर ले जाएगा जो एक अलग विधानसभा में हो सकता है।
जॉन गिब

2
@ श्रीहरिश्चलाकापति typeof(this);संकलन नहीं करता है। आपको मिलता हैError 1 Type expected
जॉन गिब

26

सभी प्रस्तावित उत्तरों में से सबसे आसान तरीका है

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;

1
यदि फ़ाइल संसाधनों के भाग का हिस्सा नहीं है तो इस तरह से एक्सेस नहीं कर सकते क्योंकि ओपी स्पष्ट रूप से बताता है कि यह सिर्फ एक फ़ाइल के रूप में जोड़ा गया है।
वोबल्स

1
उसे भी Bitmapवस्तु चाहिए थी, वस्तु नहीं Image
vapcguy

13

कोड मैं अपनी कई परियोजनाओं में उपयोग करता हूं ... यह मानता है कि आप संसाधन में केवल बिटमैप्स के रूप में छवियों को संग्रहीत करते हैं, आइकनों को नहीं

    public static Bitmap GetImageByName(string imageName)
    {
        System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
        string resourceName = asm.GetName().Name + ".Properties.Resources";
        var rm = new System.Resources.ResourceManager(resourceName, asm);
        return (Bitmap)rm.GetObject(imageName);

    }

13

सबसे अच्छी बात यह है कि उन्हें प्रोजेक्ट में संसाधन सेटिंग्स में छवि संसाधन के रूप में जोड़ना है। फिर आप संसाधन.उपयोग करके सीधे छवि प्राप्त कर सकते हैं। यह एक उत्पन्न C # संपत्ति के माध्यम से छवि प्राप्त करेगा।

यदि आप छवि को एंबेडेड संसाधन के रूप में सेट करते हैं, तो आप इसे प्राप्त कर सकते हैं:

string name = "Resources.myimage.jpg"
string namespaceName = "MyCompany.MyNamespace";
string resource = namespaceName + "." + name;
Type type = typeof(MyCompany.MyNamespace.MyTypeFromSameAssemblyAsResource);
Bitmap image = new Bitmap(type.Assembly.GetManifestResourceStream(resource));

जहाँ MyTypeFromSameAssemblyAsResource आपके विधानसभा में किसी भी प्रकार का है।


1
"नाम स्थान" का उपयोग चर नाम के रूप में नहीं किया जा सकता है और आप MyTypeFromSameAssemblyAsResource पर कैसे पहुंचे इसकी सराहना की जाएगी।
जेसन फ़ुर्स्टनबर्ग

जेसन के मुद्दे को संबोधित करते हुए टाइपो को निर्धारित किया
जॉन गिब्ब

6

नीचे एक प्रयोग करें। मैंने इसे विंडोज फॉर्म के ग्रिड व्यू सेल के साथ टेस्ट किया है।

Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;

"Resource_Image" का नाम, आप परियोजना से पा सकते हैं।

परियोजना के नाम के तहत, आप पा सकते हैं Properties। इसका विस्तार करें। वहां आप Resources.resxफाइल देख सकते हैं । खोलो इसे। अपने फ़ाइल नाम को "Resource_Image" के रूप में लागू करें।


5

"ImagePreview FormStrings.MyImageNames" नाम के साथ और ImageBox में एक नियमित रूप से प्राप्त / सेट स्ट्रिंग कास्ट विधि शामिल है, जो एक स्क्रॉलबॉक्स प्रकार की सूची से जुड़ी हुई हैं। छवियों के पास .bmp अंत के अलावा सूची में जुड़े नामों के समान नाम हैं। बिटमैप्स संसाधनों में घसीटा जाता है ।resx

Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames);
Bitmap myImage = (Bitmap)rm;
ImagePreview.Image = myImage;

5

मेरे मामले में - मैं अपने संसाधन में प्रतीक का उपयोग कर रहा था , लेकिन मुझे उन्हें गतिशील रूप से कुछ (एस) के चित्र के रूप में जोड़ने की आवश्यकता थी ToolStripMenuItem। तो मेरे द्वारा बनाई गई विधि में (जो नीचे कोड स्निपेट कहां से आता है), मुझे आइकन संसाधनों को बिटमैप्स में बदलना था इससे पहले कि मैं उन्हें मेरे अलावा वापस कर सकूं MenuItem

string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();

कुछ और के बारे में पता करने के लिए, यदि आपकी छवि / आइकन में अपने नाम में रिक्त स्थान ("") है, जब आप उन्हें अपने संसाधन में जोड़ते हैं, तो वीएस स्वचालित रूप से उन जगहों को "_" (ओं) से बदल देगा। क्योंकि, आपके संसाधन का नामकरण करते समय रिक्त स्थान एक मान्य वर्ण नहीं है। यही कारण है कि मैं Replace()अपने संदर्भित कोड में विधि का उपयोग कर रहा हूं । आप संभवतः उस रेखा को अनदेखा कर सकते हैं।


5

मैं सुझाव देता हूँ:

System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
Image yourImage = Image.FromStream(file);

Msdn से: http://msdn.microsoft.com/en-us/library/aa287676(v=vs.71).aspx

Image.FromStream का उपयोग करना बेहतर है क्योंकि आपको छवि का प्रारूप (bmp, png, ...) जानने की आवश्यकता नहीं है।


5

JDS के जवाब ने सबसे अच्छा काम किया। C # उदाहरण लोड हो रही छवि:

  • संसाधन के रूप में छवि को शामिल करें (प्रोजेक्ट ट्री-> संसाधन, वांछनीय फ़ाइल जोड़ने के लिए राइट क्लिक करें ImageName.png)
  • एंबेडेड रिसोर्स (प्रोजेक्ट ट्री-> रिसोर्स-> ImageName.png, राइट क्लिक सेलेक्ट प्रॉपर्टीज)
  • .Png फ़ाइल स्वरूप (.bmp .jpg भी ठीक होना चाहिए)

pictureBox1.Image = ProjectName.Properties.Resources.ImageName;

निम्नलिखित बातों पर ध्यान दें:

  • संसाधन छवि फ़ाइल "ImageName.png" है, फ़ाइल एक्सटेंशन को छोड़ दिया जाना चाहिए।
  • ProjectName शायद "असेंबली नेम" के रूप में अधिक पर्याप्त रूप से समझा जा सकता है, जो कि प्रोजेक्ट-> गुण पृष्ठ पर संबंधित पाठ प्रविष्टि है।

उदाहरण कोड लाइन VisualStudio 2015 समुदाय का सफलतापूर्वक उपयोग करके चलाई जाती है।


4

आप इस तरह से bmp को भी बचा सकते हैं:

var bmp = Resources.ImageName;

आशा करता हूँ की ये काम करेगा!


2

अजीब तरह से, डिजाइनर में प्रहार से मुझे लगता है कि एक बहुत सरल दृष्टिकोण लगता है:

छवि .Properties.Resources से उपलब्ध होने लगती है।

मैं बस एक छवि का उपयोग कर रहा हूं क्योंकि मुझे इसमें रुचि रखने वाले सभी को इस पर एक छवि के साथ नियंत्रण में चिपकाना है।

(नेट 4.0, वीएस2010।)


2

मैंने अपने एक प्रोजेक्ट के डिजाइनर कोड को देखा और देखा कि इस नोटेशन का इस्तेमाल किया

myButton.Image = global::MyProjectName.Properties.Resources.max;

जहां अधिकतम उस संसाधन का नाम है जिसे मैंने परियोजना में अपलोड किया है।


1

WPF या सिल्वरलाइट के साथ काम करते समय या आप इस लाइन का उपयोग कर सकते हैं, खासकर जहां आपके पास स्रोत स्ट्रिंग पहले से ही XAML मार्कअप में है:

(ImageSource)new ImageSourceConverter().ConvertFromString(ImagePath);

जहां ImagePath कुछ इस तरह है:

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";

-1
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(444, 25);
this.toolStrip1.TabIndex = 0;
this.toolStrip1.Text = "toolStrip1";
object O = global::WindowsFormsApplication1.Properties.Resources.ResourceManager.GetObject("best_robust_ghost");

ToolStripButton btn = new ToolStripButton("m1");
btn.DisplayStyle = ToolStripItemDisplayStyle.Image;
btn.Image = (Image)O;
this.toolStrip1.Items.Add(btn);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.