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

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.


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

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;

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

    }

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.


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".


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;

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.


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, ...).


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.


4

Anda juga dapat menyimpan bmp dalam var seperti ini:

var bmp = Resources.ImageName;

semoga membantu!


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


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.


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

-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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.