2009-07-28 3 views
167

Ich habe ein Bild in meinem Projekt unter Resources/myimage.jpg gespeichert. Wie kann ich dieses Bild dynamisch in das Bitmap-Objekt laden?Laden Bild aus Ressourcen Bereich des Projekts in C#

+1

Blick auf diese Antwort: http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/7375570#7375570 – Roland

+0

Dies war eine Frage das wurde später gefragt, ist aber verwandt, wenn nicht ein Duplikat: http://stackoverflow.com/questions/13592150/load-image-from-resources – vapcguy

Antwort

198

Verwenden Sie Windows Forms? Wenn Sie das Bild mit Hilfe der Eigenschaften/Ressourcen UI hinzugefügt haben, haben Sie Zugriff auf das Bild von generierten Code zu bekommen, so können Sie einfach tun:

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage); 
+0

Nein, es wird als eine einfache Datei in den Ordner Ressourcen hinzugefügt. –

+8

Ah ok. In diesem Fall denke ich @ Hallgrim hat die Antwort für Sie mit Ressourcen-Streams. Wenn Sie Windows Forms * benutzen, würde ich Sie dringend bitten, das Bild zu löschen und es erneut von der Benutzeroberfläche hinzuzufügen - viel einfacher so. –

97

Sie können einen Verweis auf das Bild erhalten die folgende Art und Weise:

Image myImage = Resources.myImage; 

Wenn Sie eine Kopie des Bildes machen wollen, müssen Sie folgendes tun: vergessen

Bitmap bmp = new Bitmap(Resources.myImage); 

nicht o zu entsorgen f bmp wenn Sie damit fertig sind. Wenn Sie nicht den Namen der Ressource Bild zur Compile-Zeit kennen, können Sie einen Ressourcenmanager verwenden:

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

Der Vorteil der Resourcemanager ist, dass Sie es verwenden können, wo Resources.myImage normalerweise würde sein von Bereich, oder wo Sie dynamisch auf Ressourcen zugreifen möchten. Darüber hinaus funktioniert dies für Sounds, Konfigurationsdateien usw.

+12

Hinweis: Verwenden Sie Properties.Resources.myImage; – splattne

+0

Ich versuche, das Ressourcenobjekt an mein Datagrid zu binden, aber es wird nicht mit Ihrer Methode angezeigt. Die Datagrid-Bildspalte wird templatisiert. – alice7

63

Sie müssen es aus Ressourcen-Stream laden.

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

Wenn Sie alle Ressourcennamen in Ihrer Assembly wissen wollen, gehen Sie mit:

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

foreach (string one in all) { 
    MessageBox.Show(one); 
} 
+26

Sie sollten Reflektionen nicht verwenden müssen - dies erscheint angesichts der einfacheren verfügbaren Methoden zu kompliziert. –

+0

Diese Lösung funktioniert nicht in C#/Windows Phone. NETCF - GetManifestResourceNames() gibt nur einen einzelnen Namen zurück, nämlich den des Assembly-DLL-Moduls. Im Manifest ist nur eine Ressource verfügbar - der Stream-Blob des DLL-Moduls. Ohne C++ und unsicheren Code, mit denen Sie Win32-API-Aufrufe aufrufen können, ist es ehrlich gesagt ein roher Schmerz in den Arsch, mit diesem Stück Speicher zu arbeiten. –

+2

Sie können auch kurz "typeof (this) .Assembly" verwenden. –

13

Das Beste, was sie als Bild Ressourcen in den Ressourceneinstellungen im Projekt hinzuzufügen ist. Dann können Sie das Bild direkt abrufen, indem Sie Resources.myimage ausführen. Dies wird das Bild über eine generierte C# -Eigenschaft erhalten.

Wenn Sie nur das Bild als Eingebettete Ressource festlegen können Sie es mit:

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

Wo MyTypeFromSameAssemblyAsResource jede Art, die Sie in Ihrer Assembly haben.

+2

Was ist' Typ'? – radbyx

+1

"Namespace" kann nicht als Variablenname verwendet werden und wie Sie zu MyTypeFromSameAssemblyAsResource gelangen, wäre wünschenswert. –

+0

Fehler behoben, der Jasons Problem anspricht –

5

Mit und ImageBox den Namen „ImagePreview FormStrings.MyImageNames enthält ein regelmäßigen get/set-String Gussverfahren, das zu einer scrollbox Typenliste verknüpft ist. Die Bilder haben die gleichen Namen wie die verknüpften Namen auf der Liste, mit Ausnahme von . die .bmp Endungen Alle Bitmaps werden in die resources.resx gezogen

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

Merkwürdigerweise von Stossen im Designer finde ich, was eine viel einfachere Lösung zu sein scheint:

Das Bild scheint zu sein, verfügbar von .Properties.Resources.

Ich verwende einfach ein Bild, da alles, was mich interessiert, es in ein Steuerelement mit einem Bild einfügen wird.

(Net 4.0, VS2010.

)
24

Way einfacher als die meisten alle vorgeschlagenen Antworten

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

Kann nicht auf diese Weise zugreifen, wenn die Datei nicht Teil des Ressourcenmanifests ist, da das OP eindeutig angibt, dass es nur als Datei hinzugefügt wurde. – Wobbles

+0

Er wollte auch ein 'Bitmap'-Objekt, kein' Image'-Objekt. – vapcguy

4

In meinem Fall - ich wurde mit Icons in meiner Ressource, aber ich brauchte sie dynamisch als Bilder hinzufügen einige ToolStripMenuItem (s). Also musste ich in der Methode, die ich erstellt habe (wo das Code-Snippet unten herkommt), die Icon-Ressourcen in Bitmaps konvertieren, bevor ich sie für die Addition zu meinem MenuItem zurückgeben konnte.

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

Etwas anderes bewusst zu sein, wenn Ihr Bild/Symbol Räume hat (“„) _ ‚(s) in seinem Namen, wenn Sie sie auf Ihre Ressource hinzufügen, VS werden diese Räume mit automatisch ersetzen‘. Denn Leerzeichen sind kein gültiges Zeichen beim Benennen Ihrer Ressource. Deshalb verwende ich die Replace() Methode in meinem referenzierten Code. Sie können diese Zeile wahrscheinlich ignorieren.

9

-Code verwende ich in mehreren meiner Projekte ... Es geht davon aus, dass Sie speichern Bilder in Ressource nur als Bitmaps nicht Symbole

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

    } 
+0

Das ist sehr nett. Vielen Dank :) – Derrick

3

Ich schlage vor:

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

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

Die Verwendung von Image.FromStream ist besser, weil Sie das Format des Bildes (bmp, png, ...) nicht kennen müssen.

2

ich an der Designer-Code von einem meiner Projekte sah und bemerkte, dass es diese Art der Notation

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

wobei max der Name der Ressource, die ich in das Projekt hochgeladen.

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

Oder Sie könnten diese Linie verwenden, wenn sie mit WPF oder Silverlight zu tun, vor allem wenn Sie die Quellzeichenfolge bereits im XAML-Markup haben:

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

Wo die ImagePath ist so etwas wie:

string ImagePath = "/ProjectName;component/Resource/ImageName.png"; 
2

Die Antwort von JDS hat am besten funktioniert. C# Beispiel Lade Bild:

  • Das Bild kann als Ressource (Projekt tree-> Ressourcen der rechten Maustaste die gewünschte Datei ImageName.png hinzufügen)
  • Eingebettete Ressource (Projekt tree-> Ressourcen-> ImageName.png klicken Sie rechts wählen Sie Eigenschaften)
  • .png-Datei-Format (.bmp .jpg auch OK)

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

Beachten Sie Folgendes sein sollte:

  • Die Ressourcen-Image-Datei ist "ImageName.png", Dateierweiterung sollte weggelassen werden.
  • ProjectName kann vielleicht besser als "Assembly name" verstanden werden, was der entsprechende Texteintrag auf der Projekt-> Eigenschaftenseite sein soll.
  • Die Beispielcodezeile wird erfolgreich mit VisualStudio 2015 Community ausgeführt.

    2

    Sie können auch die bmp in einem var wie folgt speichern:

    var bmp = Resources.ImageName; 
    

    hoffe, es hilft!