Laden Sie das Bild aus dem Ressourcenbereich des Projekts in C #


212

Ich habe ein Bild in meinem Projekt unter Resources / myimage.jpg gespeichert. Wie kann ich dieses Bild dynamisch in ein Bitmap-Objekt laden?


1
Schauen Sie sich diese Antwort an: stackoverflow.com/questions/94456/…
Roland

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

Antworten:


242

Verwenden Sie Windows Forms? Wenn Sie das Bild über die Benutzeroberfläche "Eigenschaften / Ressourcen" hinzugefügt haben, erhalten Sie über den generierten Code Zugriff auf das Bild. Sie können dies also einfach tun:

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

Nein, es wird als einfache Datei zum Ordner Ressourcen hinzugefügt.
Pavel Bastov

9
Ah ok. In diesem Fall hat @ Hallgrim die Antwort für Sie mithilfe von Ressourcenströmen. Wenn Sie sind mit Windows Forms würde ich Sie bitten , um das Bild zu löschen und neu hinzufügen , es aus dem UI - viel einfacher , auf diese Weise.
Matt Hamilton

114

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

Image myImage = Resources.myImage;

Wenn Sie eine Kopie des Bildes erstellen möchten , müssen Sie folgende Schritte ausführen:

Bitmap bmp = new Bitmap(Resources.myImage);

Vergessen Sie nicht, bmp zu entsorgen, wenn Sie damit fertig sind. Wenn Sie den Namen des Ressourcenabbilds zur Kompilierungszeit nicht kennen, können Sie einen Ressourcenmanager verwenden:

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

Der Vorteil des ResourceManager besteht darin, dass Sie ihn dort verwenden können, wo Resources.myImage normalerweise außerhalb des Gültigkeitsbereichs liegt oder wo Sie dynamisch auf Ressourcen zugreifen möchten. Darüber hinaus funktioniert dies für Sounds, Konfigurationsdateien usw.


17
Hinweis: Verwenden Sie Properties.Resources.myImage.
Splattne

Ich versuche, das Ressourcenobjekt an mein Datagrid zu binden, aber es wird mit Ihrer Methode nicht angezeigt. Die Datagrid-Bildspalte ist mit Vorlagen versehen.
Alice7

70

Sie müssen es aus dem Ressourcenstrom laden.

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

Wenn Sie alle Ressourcennamen in Ihrer Assembly kennen möchten, gehen Sie wie folgt vor:

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

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

29
Sie sollten keine Reflexion verwenden müssen - dies erscheint angesichts der einfacheren verfügbaren Methoden zu kompliziert.
Charlie Salts

Diese Lösung funktioniert nicht in C # / Windows Phone .NETCF - GetManifestResourceNames () gibt nur einen einzigen Namen zurück, 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 dem Sie Win32-API-Aufrufe aufrufen können, ist es ehrlich gesagt ein königlicher Schmerz, mit diesem Speicherblock zu arbeiten.
Mark Jones

2
Sie können auch typeof(this).Assemblykurz verwenden.
Sri Harsha Chilakapati

1
@ SriHarshaChilakapati typeof(this)wird nicht funktionieren. this.GetType().Assemblyist dem, was Sie gesagt haben, am nächsten, aber es ist riskant, weil es eine geerbte Superklasse aufgreift, die sich möglicherweise in einer anderen Baugruppe befindet.
John Gibb

2
@SriHarshaChilakapati typeof(this);kompiliert nicht. Du erhältstError 1 Type expected
John Gibb

26

Viel einfacher als die meisten vorgeschlagenen Antworten

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

1
Auf diese Weise kann nicht zugegriffen werden, wenn die Datei nicht Teil des Ressourcenmanifests ist, da das OP eindeutig angibt, dass sie nur als Datei hinzugefügt wurde.
Wobbles

1
Er wollte auch ein BitmapObjekt, kein ImageObjekt.
Vapcguy

13

Code, den ich in mehreren meiner Projekte verwende ... Es wird davon ausgegangen, dass Sie Bilder nur als Bitmaps und nicht als Symbole in der Ressource speichern

    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

Am besten fügen Sie sie als Bildressourcen in den Ressourceneinstellungen des Projekts hinzu. Dann können Sie das Bild direkt abrufen, indem Sie Resources.myimage ausführen. Dadurch wird das Bild über eine generierte C # -Eigenschaft abgerufen.

Wenn Sie das Bild nur als eingebettete Ressource festlegen, erhalten 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));

Wobei MyTypeFromSameAssemblyAsResource ein beliebiger Typ ist, den Sie in Ihrer Assembly haben.


1
"Namespace" kann nicht als Variablenname verwendet werden und es wird geschätzt, wie Sie zu MyTypeFromSameAssemblyAsResource gelangen.
Jason Fuerstenberg

Der Tippfehler in Bezug auf Jasons Problem wurde behoben
John Gibb

6

Verwenden Sie unter einem. Ich habe dies mit der Grid-Ansichtszelle von Windows Form getestet.

Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;

Den Namen "Resource_Image" finden Sie im Projekt.

Unter dem Namen des Projekts finden Sie Properties. Es ausweiten. Dort können Sie Resources.resxDatei sehen. Öffne es. Wenden Sie Ihren Dateinamen als "Resource_Image" an.


5

Mit und ImageBox mit dem Namen "ImagePreview FormStrings.MyImageNames" enthält eine reguläre Methode zum Abrufen / Festlegen von Zeichenfolgen, die mit einer Liste von Bildlauffeldtypen verknüpft sind. Die Bilder haben dieselben Namen wie die verknüpften Namen in der Liste, mit Ausnahme der .bmp-Endungen. Alle Bitmaps werden in die Datei resources.resx gezogen

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

5

In meinem Fall - Ich habe Symbole in meiner Ressource verwendet, musste sie jedoch dynamisch als Bilder zu einigen hinzufügen ToolStripMenuItem. Bei der von mir erstellten Methode (von der das folgende Codefragment stammt) musste ich die Symbolressourcen in Bitmaps konvertieren, bevor ich sie zur Ergänzung zu meiner zurückgeben konnte MenuItem.

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

Beachten Sie Folgendes: Wenn Ihr Bild / Symbol beim Hinzufügen zu Ihrer Ressource Leerzeichen ("") enthält, ersetzt VS diese Leerzeichen automatisch durch "_" (s). Weil Leerzeichen beim Benennen Ihrer Ressource kein gültiges Zeichen sind. Aus diesem Grund verwende ich die Replace()Methode in meinem Code, auf den verwiesen wird. Sie können diese Zeile wahrscheinlich einfach ignorieren.


5

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, da Sie das Format des Bildes (bmp, png, ...) nicht kennen müssen.


5

Die Antwort von JDS funktionierte am besten. C # Beispiel zum Laden eines Bildes:

  • Fügen Sie das Bild als Ressource ein (Projektbaum-> Ressourcen, klicken Sie mit der rechten Maustaste, um die gewünschte Datei ImageName.png hinzuzufügen).
  • Eingebettete Ressource (Projektbaum-> Ressourcen-> ImageName.png, Rechtsklick Eigenschaften auswählen)
  • .png-Dateiformat (.bmp .jpg sollte ebenfalls in Ordnung sein)

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

Beachten Sie Folgendes:

  • Die Ressourcenbilddatei lautet "ImageName.png", die Dateierweiterung sollte weggelassen werden.
  • Projektname kann möglicherweise besser als "Baugruppenname" verstanden werden, der der entsprechende Texteintrag auf der Seite Projekt-> Eigenschaften sein soll.

Die Beispielcodezeile wird erfolgreich mit VisualStudio 2015 Community ausgeführt.


4

Sie können den BMP auch in einer Variablen wie der folgenden speichern:

var bmp = Resources.ImageName;

ich hoffe es hilft!


2

Seltsamerweise finde ich beim Stöbern im Designer einen viel einfacheren Ansatz:

Das Bild scheint unter .Properties.Resources verfügbar zu sein.

Ich verwende einfach ein Bild, da ich es nur in ein Steuerelement mit einem Bild einfügen möchte.

(Net 4.0, VS2010.)


2

Ich habe mir den Designer-Code aus einem meiner Projekte angesehen und festgestellt, dass er diese Notation verwendet

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

Dabei ist max der Name der Ressource, die ich in das Projekt hochgeladen habe.


1

Oder Sie können diese Zeile verwenden, wenn Sie mit WPF oder Silverlight arbeiten, insbesondere wenn Sie die Quellzeichenfolge bereits im XAML-Markup haben:

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

Wo der ImagePath so etwas wie:

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.