Muat gambar dari area sumber daya proyek dalam C #

Jawaban:

242

Apakah Anda menggunakan Formulir Windows? Jika Anda telah menambahkan gambar menggunakan Properties / Resources UI, Anda mendapatkan akses ke gambar dari kode yang dihasilkan, sehingga Anda bisa melakukan ini:

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Matt Hamilton
sumber
Tidak, itu ditambahkan sebagai file biasa ke folder Resources.
Pavel Bastov
9
Ah baiklah. Dalam hal ini saya pikir @ Hallgrim's mendapatkan jawaban untuk Anda menggunakan sumber daya aliran. Jika Anda adalah menggunakan Windows Forms saya akan mendorong Anda untuk menghapus gambar dan menambahkannya kembali dari UI - jauh lebih mudah seperti itu.
Matt Hamilton
114

Anda bisa mendapatkan referensi ke gambar dengan cara berikut:

Image myImage = Resources.myImage;

Jika Anda ingin membuat salinan gambar, Anda harus melakukan yang berikut:

Bitmap bmp = new Bitmap(Resources.myImage);

Jangan lupa untuk membuang bmp saat Anda selesai menggunakannya. Jika Anda tidak tahu nama gambar sumber daya pada waktu kompilasi, Anda dapat menggunakan manajer sumber daya:

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

Manfaat dari ResourceManager adalah Anda dapat menggunakannya di mana Resources.myImage biasanya berada di luar jangkauan, atau di mana Anda ingin mengakses sumber daya secara dinamis. Selain itu, ini berfungsi untuk suara, file konfigurasi, dll.

Charlie Garts
sumber
17
Catatan: gunakan Properties.Resources.myImage;
splattne
Saya mencoba untuk mengikat objek sumber daya ke datagrid saya tetapi tidak muncul menggunakan metode Anda. Kolom gambar datagrid templatized.
alice7
70

Anda perlu memuatnya dari aliran sumber daya.

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

Jika Anda ingin mengetahui semua nama sumber daya di majelis Anda, ikuti dengan:

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

foreach (string one in all) {
    MessageBox.Show(one);
}
Josip Medved
sumber
29
Anda seharusnya tidak perlu menggunakan refleksi - ini tampaknya terlalu rumit mengingat metode sederhana yang tersedia.
Charlie Garts
Solusi ini tidak berfungsi di C # / Windows Phone .NETCF --GetManifestResourceNames () hanya mengembalikan satu nama, yaitu modul assembly-DLL. Hanya ada satu sumber daya yang tersedia di manifes - gumpalan aliran modul DLL. Tanpa C ++ dan kode yang tidak aman memungkinkan Anda untuk memanggil panggilan API Win32, terus terang itu adalah rasa sakit kerajaan di pantat untuk bekerja dengan potongan memori ini.
Mark Jones
2
Anda juga dapat menggunakan typeof(this).Assemblysingkatnya.
Sri Harsha Chilakapati
1
@SriHarshaChilakapati typeof(this)tidak akan berfungsi. this.GetType().Assemblyadalah yang paling dekat dengan apa yang Anda katakan, tetapi berisiko karena akan mengambil superclass warisan yang mungkin berada di majelis yang berbeda.
John Gibb
2
@SriHarshaChilakapati typeof(this);tidak dikompilasi. Anda dapatError 1 Type expected
John Gibb
26

Jauh lebih mudah daripada kebanyakan semua jawaban yang diajukan

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
JDS
sumber
1
Tidak dapat mengakses seperti itu jika file tersebut bukan bagian dari manifes sumber daya karena OP dengan jelas menyatakan itu hanya ditambahkan sebagai file.
Goyangan
1
Dia juga menginginkan Bitmapobjek, bukan Imageobjek.
vapcguy
13

Kode yang saya gunakan di beberapa proyek saya ... Ini mengasumsikan bahwa Anda menyimpan gambar di sumber daya hanya sebagai bitmap bukan ikon

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

    }
Gary Kindel
sumber
13

Yang terbaik adalah menambahkan mereka sebagai Sumber Daya Gambar dalam pengaturan Sumber Daya di Proyek. Maka Anda bisa mendapatkan gambar secara langsung dengan melakukan Resources.myimage. Ini akan mendapatkan gambar melalui properti C # yang dihasilkan.

Jika Anda hanya mengatur gambar sebagai Sumber Daya Tertanam Anda bisa mendapatkannya dengan:

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

Di mana MyTypeFromSameAssemblyAsResource adalah jenis apa pun yang Anda miliki di perakitan Anda.

Hallgrim
sumber
1
"namespace" tidak dapat digunakan sebagai nama variabel dan bagaimana Anda sampai di MyTypeFromSameAssemblyAsResource akan dihargai.
Jason Fuerstenberg
memperbaiki kesalahan ketik yang membahas masalah Jason
John Gibb
6

Gunakan di bawah ini. Saya telah menguji ini dengan sel tampilan Grid formulir Windows.

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

Nama "Resource_Image", Anda dapat menemukan dari proyek.

Di bawah nama proyek, Anda dapat menemukannya Properties. Perluas itu. Di sana Anda dapat melihat Resources.resxfile. Buka. Terapkan nama file Anda sebagai "Resource_Image".

Dzero
sumber
5

Dengan dan ImageBox bernama "ImagePreview FormStrings.MyImageNames berisi metode string get / set reguler, yang ditautkan ke daftar jenis kotak gulir. Gambar memiliki nama yang sama dengan nama yang ditautkan dalam daftar, kecuali untuk akhiran .bmp. Semua bitmap diseret ke resources.resx

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

Dalam kasus saya - saya menggunakan Ikon di sumber saya, tetapi saya perlu menambahkannya secara dinamis sebagai Gambar ke beberapa ToolStripMenuItem(s). Jadi dalam metode yang saya buat (dari sinilah cuplikan kode di bawah ini berasal), saya harus mengonversi sumber daya ikon menjadi bitmap sebelum saya bisa mengembalikannya sebagai tambahan untuk saya MenuItem.

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

Hal lain yang perlu diperhatikan, jika gambar / ikon Anda memiliki spasi ("") di namanya saat Anda menambahkannya ke sumber daya Anda, VS akan secara otomatis mengganti spasi tersebut dengan "_". Karena, spasi bukan karakter yang valid saat memberi nama sumber daya Anda. Itulah sebabnya saya menggunakan Replace()metode dalam kode referensi saya. Anda mungkin bisa mengabaikannya saja.

DSmith
sumber
5

Saya menyarankan:

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

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

Menggunakan Image.FromStream lebih baik karena Anda tidak perlu tahu format gambar (bmp, png, ...).

Davide Icardi
sumber
5

Jawaban JDS bekerja paling baik. C # contoh memuat gambar:

  • Sertakan gambar sebagai Sumberdaya (Project tree-> Resources, klik kanan untuk menambahkan file yang diinginkan ImageName.png)
  • Sumberdaya Tertanam (Project tree-> Resources-> ImageName.png, klik kanan pilih properti)
  • format file .png (.bmp .jpg juga harus OK)

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

Perhatikan hal-hal berikut:

  • File gambar sumber daya adalah "ImageName.png", ekstensi file harus dihilangkan.
  • ProjectName mungkin lebih dipahami sebagai "Nama perakitan", yang merupakan entri teks masing-masing pada halaman Project-> Properties.

Baris kode contoh dijalankan dengan sukses menggunakan Komunitas VisualStudio 2015.

pengguna3674642
sumber
4

Anda juga dapat menyimpan bmp dalam var seperti ini:

var bmp = Resources.ImageName;

semoga membantu!

F.joksch
sumber
2

Anehnya, dari mencari-cari di desainer saya menemukan apa yang tampaknya menjadi pendekatan yang lebih sederhana:

Gambar tampaknya tersedia dari .Properties.Resources.

Saya hanya menggunakan gambar karena semua yang saya tertarik adalah menempelkannya ke kontrol dengan gambar di atasnya.

(Net 4.0, VS2010.)

Loren Pechtel
sumber
2

Saya melihat kode perancang dari salah satu proyek saya dan memperhatikannya menggunakan notasi ini

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

di mana max adalah nama sumber daya yang saya unggah ke dalam proyek.

Andrew Stein
sumber
1

Atau Anda bisa menggunakan baris ini ketika berhadapan dengan WPF atau Silverlight, terutama di mana Anda sudah memiliki string sumber di markup XAML:

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

Di mana ImagePath adalah sesuatu seperti:

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";
TChadwick
sumber
-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);
IR.Programmer
sumber