Projemde Kaynaklar / myimage.jpg dosyasında depolanmış bir resim var. Bu görüntüyü Bitmap nesnesine dinamik olarak nasıl yükleyebilirim?
Projemde Kaynaklar / myimage.jpg dosyasında depolanmış bir resim var. Bu görüntüyü Bitmap nesnesine dinamik olarak nasıl yükleyebilirim?
Yanıtlar:
Windows Forms mu kullanıyorsunuz? Görüntüyü Özellikler / Kaynaklar Kullanıcı Arayüzünü kullanarak eklediyseniz, oluşturulan koddan görüntüye erişebilirsiniz, böylece şunları yapabilirsiniz:
var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Görüntüye şu şekilde bir referans alabilirsiniz:
Image myImage = Resources.myImage;
Görüntünün bir kopyasını oluşturmak istiyorsanız, aşağıdakileri yapmanız gerekir:
Bitmap bmp = new Bitmap(Resources.myImage);
İşiniz bittiğinde bmp'yi atmayı unutmayın . Derleme sırasında kaynak görüntünün adını bilmiyorsanız, bir kaynak yöneticisi kullanabilirsiniz:
ResourceManager rm = Resources.ResourceManager;
Bitmap myImage = (Bitmap)rm.GetObject("myImage");
ResourceManager'ın yararı, onu Resources.myImage öğesinin normalde kapsam dışı olacağı veya kaynaklara dinamik olarak erişmek istediğiniz yerde kullanabilmenizdir. Ayrıca, sesler, yapılandırma dosyaları vb. İçin de çalışır.
Kaynak akışından yüklemeniz gerekir.
Bitmap bmp = new Bitmap(
System.Reflection.Assembly.GetEntryAssembly().
GetManifestResourceStream("MyProject.Resources.myimage.png"));
Montajınızdaki tüm kaynak adlarını bilmek istiyorsanız, şununla gidin:
string[] all = System.Reflection.Assembly.GetEntryAssembly().
GetManifestResourceNames();
foreach (string one in all) {
MessageBox.Show(one);
}
typeof(this).Assembly
Kısaca da kullanabilirsiniz .
typeof(this)
çalışmaz. this.GetType().Assembly
söylediklerinize en yakın olanıdır, ancak risklidir, çünkü farklı bir montajda olabilecek kalıtsal bir süper sınıf alır.
typeof(this);
. Sen almakError 1 Type expected
Önerilen cevapların çoğundan çok daha kolay
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
nesne değil, bir nesne istiyordu Image
.
Bazı projelerimde kullandığım kod ... Görüntüleri sadece simgeler değil bitmapler olarak kaynakta sakladığınızı varsayar
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);
}
En iyi şey, bunları Proje'deki Kaynaklar ayarlarına Resim Kaynakları olarak eklemektir. Sonra doğrudan Resources.myimage yaparak görüntüyü alabilirsiniz. Bu, görüntüyü oluşturulan bir C # özelliği aracılığıyla alır.
Görüntüyü Gömülü Kaynak olarak ayarladıysanız, aşağıdakileri alabilirsiniz:
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));
Burada MyTypeFromSameAssemblyAsResource, derlemenizde bulunan herhangi bir türdür.
Birinin altında kullanın. Bunu Windows formunun Grid view cell ile test ettim.
Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;
"Resource_Image" adını, projeden bulabilirsiniz.
Projenin adı altında bulabilirsiniz Properties
. Genişletin. Orada Resources.resx
dosyayı görebilirsiniz . Aç onu. Dosya adınızı "Kaynak_Görüntü" olarak uygulayın.
İle ve ImageBox adlı "ImagePreview FormStrings.MyImageNames bir kaydırma kutusu türü listesine bağlı normal bir get / set dize döküm yöntemi içeriyor. Görüntüler .bmp sonları hariç, listede bağlantılı adlarla aynı ada sahiptir. bitmapler resources.resx dosyasına sürüklenir
Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames);
Bitmap myImage = (Bitmap)rm;
ImagePreview.Image = myImage;
Benim durumumda - Kaynağımda Simgeler kullanıyordum , ancak bunları bazılarına dinamik olarak Görüntüler olarak eklemem gerekiyordu ToolStripMenuItem
. Bu yüzden oluşturduğum yöntemde (aşağıdaki kod snippet'inin geldiği yer), simge kaynaklarını bitmap'lere dönüştürmek zorunda kaldım MenuItem
.
string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();
Dikkat edilmesi gereken başka bir şey, resminizin / simgenizin kaynağına eklediğinizde adında boşluk ("") varsa, VS bu boşlukları otomatik olarak "_" (s) ile değiştirecektir. Çünkü, kaynağınız adlandırılırken boşluklar geçerli bir karakter değildir. Bu yüzden Replace()
başvurulan kodumda yöntemi kullanıyorum . Büyük olasılıkla bu satırı görmezden gelebilirsiniz.
Öneririm:
System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file =
thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
Image yourImage = Image.FromStream(file);
Msdn adresinden : http://msdn.microsoft.com/en-us/library/aa287676(v=vs.71).aspx
Görüntünün biçimini (bmp, png, ...) bilmenize gerek olmadığı için Image.FromStream kullanmak daha iyidir.
JDS'nin cevabı en iyi sonucu verdi. C # örnek yükleme görüntüsü:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Aşağıdakilere dikkat edin:
Örnek kod satırı, VisualStudio 2015 Topluluğu kullanılarak başarıyla çalıştırılır.
Garip bir şekilde, tasarımcıya atılmaktan çok daha basit bir yaklaşım olduğunu düşünüyorum:
Görüntü .Properties.Resources adresinden kullanılabilir gibi görünüyor.
Sadece ilgilendiğim tek şey bir görüntüyü üzerinde bir görüntüye sahip bir kontrole yapıştırmak olduğu için kullanıyorum.
(Net 4.0, VS2010.)
Tasarımcı koduna projelerimden birinden baktım ve bu gösterimi kullandığını fark ettim
myButton.Image = global::MyProjectName.Properties.Resources.max;
Burada max, projeye yüklediğim kaynağın adıdır.
Veya WPF veya Silverlight ile uğraşırken, özellikle XAML işaretlemesinde zaten kaynak dizeye sahip olduğunuzda bu satırı kullanabilirsiniz:
(ImageSource)new ImageSourceConverter().ConvertFromString(ImagePath);
ImagePath aşağıdaki gibi bir şeydir:
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);