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

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);
Matt Hamilton
quelle
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.

Charlie Salts
quelle
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);
}
Josip Medved
quelle
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;
JDS
quelle
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);

    }
Gary Kindel
quelle
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.

Hallgrim
quelle
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.

Dzero
quelle
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;
Verletzer
quelle
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.

DSmith
quelle
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.

Davide Icardi
quelle
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.

user3674642
quelle
4

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

var bmp = Resources.ImageName;

ich hoffe es hilft!

F.joksch
quelle
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.)

Loren Pechtel
quelle
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.

Andrew Stein
quelle
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";
TChadwick
quelle
-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);
IR.Programmer
quelle