Saya memiliki gambar di proyek saya yang disimpan di Resources / myimage.jpg. Bagaimana saya bisa secara dinamis memuat gambar ini ke objek Bitmap?
Saya memiliki gambar di proyek saya yang disimpan di Resources / myimage.jpg. Bagaimana saya bisa secara dinamis memuat gambar ini ke objek Bitmap?
Jawaban:
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);
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.
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);
}
typeof(this).Assembly
singkatnya.
typeof(this)
tidak akan berfungsi. this.GetType().Assembly
adalah yang paling dekat dengan apa yang Anda katakan, tetapi berisiko karena akan mengambil superclass warisan yang mungkin berada di majelis yang berbeda.
typeof(this);
tidak dikompilasi. Anda dapatError 1 Type expected
Jauh lebih mudah daripada kebanyakan semua jawaban yang diajukan
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
objek, bukan Image
objek.
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);
}
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.
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.resx
file. Buka. Terapkan nama file Anda sebagai "Resource_Image".
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;
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.
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, ...).
Jawaban JDS bekerja paling baik. C # contoh memuat gambar:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Perhatikan hal-hal berikut:
Baris kode contoh dijalankan dengan sukses menggunakan Komunitas VisualStudio 2015.
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.)
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.
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";
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);