Ich habe ein Bild in meinem Projekt unter Resources / myimage.jpg gespeichert. Wie kann ich dieses Bild dynamisch in ein Bitmap-Objekt laden?
Ich habe ein Bild in meinem Projekt unter Resources / myimage.jpg gespeichert. Wie kann ich dieses Bild dynamisch in ein Bitmap-Objekt laden?
Antworten:
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);
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.
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);
}
typeof(this).Assembly
kurz verwenden.
typeof(this)
wird nicht funktionieren. this.GetType().Assembly
ist 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.
typeof(this);
kompiliert nicht. Du erhältstError 1 Type expected
Viel einfacher als die meisten vorgeschlagenen Antworten
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
Objekt, kein Image
Objekt.
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);
}
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.
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.resx
Datei sehen. Öffne es. Wenden Sie Ihren Dateinamen als "Resource_Image" an.
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;
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.
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.
Die Antwort von JDS funktionierte am besten. C # Beispiel zum Laden eines Bildes:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Beachten Sie Folgendes:
Die Beispielcodezeile wird erfolgreich mit VisualStudio 2015 Community ausgeführt.
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.)
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.
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";
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);