সি # তে প্রকল্পের সংস্থান অঞ্চল থেকে চিত্র লোড করুন


212

আমার প্রোজেক্টে আমার একটি রিসোর্স / myimage.jpg এ সঞ্চিত আছে। আমি কীভাবে এই চিত্রটি বিটম্যাপ অবজেক্টে গতিশীলভাবে লোড করতে পারি?


1
এই উত্তরটি দেখুন: স্ট্যাকওভারফ্লো.com
রোল্যান্ড

এই প্রশ্নটার পরে জিজ্ঞেস করা হয়েছিল, কিন্তু যদি না একটি ডুপ্লিকেট, সম্পর্কিত হয়: stackoverflow.com/questions/13592150/load-image-from-resources
vapcguy

উত্তর:


242

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

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

না, এটি রিসোর্স ফোল্ডারটিতে একটি সরল ফাইল হিসাবে যুক্ত করা হয়েছে।
পাভেল বাস্তভ

9
আহ, ঠিক আছে. সেক্ষেত্রে আমি মনে করি রিসোর্স স্ট্রীমগুলি ব্যবহার করে আপনার জন্য @ হলগ্রিমের উত্তর পেয়েছে। আপনি যদি হয় আমি মুছে দিতে পারবেন আপনার চালনা করা হবে উইন্ডোজ ফর্মগুলি ব্যবহার করে এবং এটি UI 'তে থেকে পুনরায় যুক্ত করুন - অনেক সহজ উপায় আছে।
ম্যাট হ্যামিল্টন

114

আপনি নিম্নলিখিত উপায়ে চিত্রটির একটি রেফারেন্স পেতে পারেন:

Image myImage = Resources.myImage;

আপনি যদি ছবিটির একটি অনুলিপি তৈরি করতে চান তবে আপনাকে নিম্নলিখিতগুলি করতে হবে:

Bitmap bmp = new Bitmap(Resources.myImage);

আপনি যখন এটি শেষ করেছেন তখন বিএমপি নিষ্পত্তি করতে ভুলবেন না । আপনি যদি সংকলন সময়ে রিসোর্স চিত্রটির নাম না জানেন তবে আপনি কোনও সংস্থান পরিচালক ব্যবহার করতে পারেন:

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

রিসোর্সস ম্যানেজারের সুবিধা হ'ল আপনি এটি ব্যবহার করতে পারেন যেখানে রিসোর্স.মাই আইমেজ সাধারণত সুযোগের বাইরে থাকে, বা আপনি যেখানে গতিশীলভাবে সংস্থানগুলি অ্যাক্সেস করতে চান। অতিরিক্তভাবে, এটি শব্দ, কনফিগারেশন ফাইল ইত্যাদির জন্য কাজ করে


17
দ্রষ্টব্য: বৈশিষ্ট্যগুলি ব্যবহার করুন।
স্প্লাটনে

আমি আমার ডেটাগ্রিডে রিসোর্স অবজেক্টটি বেঁধে দেওয়ার চেষ্টা করছি তবে এটি আপনার পদ্ধতিটি ব্যবহার করে প্রদর্শিত হচ্ছে না। ডেটাগ্রিড চিত্র কলামটি অস্থির হয়ে গেছে।
এলিস

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
আপনার প্রতিবিম্বটি ব্যবহার করার দরকার নেই - সহজ পদ্ধতিগুলি উপলভ্য হওয়ায় এটি অত্যধিক জটিল বলে মনে হচ্ছে।
চার্লি সল্টস

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

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

প্রকল্পের রিসোর্স সেটিংসে ইমেজ রিসোর্স হিসাবে যুক্ত করা ভাল জিনিস thing তারপরে আপনি রিসোর্স.মাইমেজ করে সরাসরি চিত্রটি পেতে পারেন। এটি উত্পন্ন সি # সম্পত্তি এর মাধ্যমে চিত্রটি পাবে।

আপনি যদি সবেমাত্র এম্বেডেড রিসোর্স হিসাবে চিত্রটি সেট করেন তবে আপনি এটি সহ পেতে পারেন:

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

যেখানে MyTypeFromSameAsorsesAsResource আপনার সমাবেশে যে কোনও ধরণের রয়েছে।


1
"নেমস্পেস" পরিবর্তনশীল নাম হিসাবে ব্যবহার করা যাবে না এবং আপনি কীভাবে মাইটাইপফ্র্যামসামেঅ্যাস্প্যাসএল রিসোর্সে পৌঁছবেন তা প্রশংসিত হবে।
জেসন ফুস্টার্নবার্গ

জেসনের ইস্যু সম্বোধন করে টাইপো স্থির করে
জন গিব

6

একের নীচে ব্যবহার করুন। আমি এটি উইন্ডোজ ফর্মের গ্রিড ভিউ সেল দিয়ে পরীক্ষা করেছি।

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

"রিসোর্স_সামগ্রী" এর নাম, আপনি প্রকল্পটি থেকে খুঁজে পেতে পারেন।

প্রকল্পের নাম অনুসারে আপনি এটি সন্ধান করতে পারেন Properties। এটি প্রসারিত করুন। সেখানে আপনি Resources.resxফাইল দেখতে পারেন । ইহা খোল. আপনার ফাইলের নামটি "রিসোর্স_সামগ্রহ" হিসাবে প্রয়োগ করুন।


5

সাথে এবং ইমেজবক্স নামের সাথে "ইমেজপ্রিভিউ ফর্মস্ট্রিংস। মাইমাজেমনেমস একটি নিয়মিত গেট / সেট স্ট্রিং কাস্ট পদ্ধতি রয়েছে যা স্ক্রোলবক্স টাইপ তালিকার সাথে যুক্ত। ছবিগুলিতে .bmp শেষগুলি বাদে তালিকায় লিঙ্কযুক্ত নামগুলির মতো একই নাম রয়েছে All সমস্ত বিটম্যাপগুলি টেনে নেওয়া হয়

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

এমএসডিএন থেকে: http://msdn.microsoft.com/en-us/library/aa287676(v=vs.71).aspx

চিত্র.ফ্রিম স্ট্রিম ব্যবহার করা আরও ভাল কারণ আপনাকে চিত্রটির ফর্ম্যাটটি জানতে হবে না (বিএমপি, পিএনজি, ...)।


5

জেডিএসের উত্তরটি সবচেয়ে ভাল কাজ করেছে। সি # উদাহরণ লোড করা চিত্র:

  • ছবিটি রিসোর্স হিসাবে অন্তর্ভুক্ত করুন (প্রকল্প বৃক্ষ-> সংস্থানসমূহ, পছন্দসই ফাইল যুক্ত করার জন্য ডান ক্লিক করুন ImageName.png)
  • এম্বেডেড রিসোর্স (প্রকল্প ট্রি-> সংস্থানসমূহ>> চিত্রনাম.পিএনজি, নির্বাচন করুন বৈশিষ্ট্যগুলিতে ডান ক্লিক করুন)
  • .png ফাইল ফর্ম্যাট (.bmp .jpg এছাড়াও ঠিক হওয়া উচিত)

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

নিম্নলিখিতগুলি নোট করুন:

  • রিসোর্স ইমেজ ফাইলটি "ImageName.png", ফাইল এক্সটেনশন বাদ দেওয়া উচিত।
  • প্রোজেক্টনাম সম্ভবত "সমাবেশের নাম" হিসাবে আরও পর্যাপ্তরূপে বোঝা যেতে পারে, যা প্রকল্প-> সম্পত্তি পৃষ্ঠাতে স্বতন্ত্র পাঠ্য এন্ট্রি হতে হবে।

উদাহরণ কোড লাইনটি ভিজুয়ালস্টুডিও 2015 সম্প্রদায়টি সফলভাবে চালিত হয়।


4

আপনি বিএমপিকে এইরকম একটি ভারেও সংরক্ষণ করতে পারেন:

var bmp = Resources.ImageName;

আশা করি এটা সাহায্য করবে!


2

আশ্চর্যজনকভাবে যথেষ্ট, ডিজাইনারে হাঁসফাঁস করা থেকে আমি খুঁজে পাই যা অনেক সহজ পদ্ধতির বলে মনে হচ্ছে:

ছবিটি প্রযোজনা.সম্পাদনা থেকে উপলব্ধ বলে মনে হচ্ছে।

আমি কেবল একটি চিত্র ব্যবহার করছি কারণ আমি আগ্রহী সমস্ত এটির কোনও চিত্রের সাথে এটি একটি নিয়ন্ত্রণে আটকানো is

(নেট 4.0, ভিএস 2010।)


2

আমি আমার একটি প্রকল্পের ডিজাইনার কোডটি দেখেছি এবং লক্ষ্য করেছি যে এটি এই স্বরলিপিটি ব্যবহার করেছে

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

যেখানে প্রকল্পটিতে আমি আপলোড করা সংস্থানটির সর্বাধিক নাম।


1

অথবা ডাব্লুপিএফ বা সিলভারলাইটের সাথে কাজ করার সময় আপনি এই লাইনটি ব্যবহার করতে পারেন, বিশেষত যেখানে এক্সএএমএল মার্কআপে ইতিমধ্যে আপনার উত্সের স্ট্রিং রয়েছে:

(ImageSource)new ImageSourceConverter().ConvertFromString(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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.