C # projesinin kaynaklar alanından görüntü yükle


Yanıtlar:


242

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

Hayır, Kaynaklar klasörüne düz bir dosya olarak eklenir.
Pavel Bastov

9
Ah tamam. Bu durumda bence @ Hallgrim kaynak akışlarını kullanarak sizin için cevabı aldı. Eğer varsa vardır , Windows Forms kullanarak ben görüntüyü silmek için teşvik ve UI onu tekrar ekleyin - Bu arada çok daha kolay.
Matt Hamilton

114

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.


17
Not: Properties.Resources.myImage komutunu kullanın;
splattne

Benim datagrid kaynak nesnesini bağlamak çalışıyorum ama yönteminizi kullanarak görünmüyor. Veri ızgarası resim sütunu şablonlaştırılmıştır.
alice7

70

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

29
Yansımayı kullanmanıza gerek yoktur - mevcut daha basit yöntemler göz önüne alındığında bu aşırı derecede karmaşık görünüyor.
Charlie Salts

Bu çözüm C # / Windows Phone .NETCF --GetManifestResourceNames () içinde çalışma derleme-DLL modülünün tek bir ad döndürür. Manifest'te yalnızca bir kaynak var - DLL modülünün akış blob'u. C ++ ve Win32 API çağrılarını çağırmanıza izin veren güvenli olmayan kod olmadan, açıkçası bu bellek yığını ile çalışmak eşek eşek kraliyet ağrısıdır.
Mark Jones

2
typeof(this).AssemblyKısaca da kullanabilirsiniz .
Sri Harsha Chilakapati

1
@SriHarshaChilakapati typeof(this)çalışmaz. this.GetType().Assemblysöylediklerinize en yakın olanıdır, ancak risklidir, çünkü farklı bir montajda olabilecek kalıtsal bir süper sınıf alır.
John Gibb

2
@SriHarshaChilakapati derlemiyor typeof(this);. Sen almakError 1 Type expected
John Gibb

26

Önerilen cevapların çoğundan çok daha kolay

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;

1
OP, dosyanın dosya olarak eklendiğini açıkça belirttiği için, dosya, kaynak manifest'in bir parçası değilse bu şekilde erişilemez.
Wobbles

1
Ayrıca bir Bitmapnesne değil, bir nesne istiyordu Image.
vapcguy

13

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

    }

13

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.


1
"ad alanı" değişken adı olarak kullanılamaz ve MyTypeFromSameAssemblyAsResource'a nasıl ulaştığınız takdir edilecektir.
Jason Fuerstenberg

Jason'ın sorununu ele alan yazım hatasını düzeltti
John Gibb

6

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.resxdosyayı görebilirsiniz . Aç onu. Dosya adınızı "Kaynak_Görüntü" olarak uygulayın.


5

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

5

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.



5

JDS'nin cevabı en iyi sonucu verdi. C # örnek yükleme görüntüsü:

  • Resmi Kaynak olarak ekleyin (Proje ağacı-> Kaynaklar, istenen ImageName.png dosyasını eklemek için sağ tıklayın)
  • Gömülü Kaynak (Proje ağacı-> Kaynaklar-> ImageName.png, özellikleri seçin sağ tıklayın)
  • .png dosya biçimi (.bmp .jpg de uygun olmalıdır)

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

Aşağıdakilere dikkat edin:

  • Kaynak resim dosyası "ImageName.png" dir, dosya uzantısı atlanmalıdır.
  • ProjectName belki de Project-> Properties sayfasındaki ilgili metin girişi olan "Assembly name" olarak daha iyi anlaşılabilir.

Örnek kod satırı, VisualStudio 2015 Topluluğu kullanılarak başarıyla çalıştırılır.


4

Bmp'yi şu şekilde de kaydedebilirsiniz:

var bmp = Resources.ImageName;

Umarım yardımcı olur!


2

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


2

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.


1

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

-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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.