Charger l'image depuis la zone de ressources du projet en C #

Réponses:

242

Utilisez-vous Windows Forms? Si vous avez ajouté l'image à l'aide de l'interface utilisateur Propriétés / Ressources, vous avez accès à l'image à partir du code généré, vous pouvez donc simplement le faire:

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Matt Hamilton
la source
Non, il est ajouté en tant que fichier brut dans le dossier Resources.
Pavel Bastov
9
Ah ok. Dans ce cas, je pense que @ Hallgrim a obtenu la réponse pour vous en utilisant des flux de ressources. Si vous êtes en utilisant Windows Forms Je vous invite à supprimer l'image et ajouter de nouveau à partir de l'interface utilisateur - beaucoup plus facile de cette façon.
Matt Hamilton
114

Vous pouvez obtenir une référence à l'image de la manière suivante:

Image myImage = Resources.myImage;

Si vous souhaitez faire une copie de l'image, vous devrez procéder comme suit:

Bitmap bmp = new Bitmap(Resources.myImage);

N'oubliez pas de vous débarrasser de bmp lorsque vous en avez terminé. Si vous ne connaissez pas le nom de l'image de ressource au moment de la compilation, vous pouvez utiliser un gestionnaire de ressources:

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

L'avantage du ResourceManager est que vous pouvez l'utiliser là où Resources.myImage serait normalement hors de portée, ou là où vous souhaitez accéder dynamiquement aux ressources. De plus, cela fonctionne pour les sons, les fichiers de configuration, etc.

Charlie Salts
la source
17
Remarque: utilisez Properties.Resources.myImage;
splattne
J'essaie de lier l'objet ressource à ma grille de données mais il n'apparaît pas en utilisant votre méthode. La colonne d'image de la grille de données est modélisée.
alice7
70

Vous devez le charger à partir du flux de ressources.

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

Si vous souhaitez connaître tous les noms de ressources de votre assembly, optez pour:

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

foreach (string one in all) {
    MessageBox.Show(one);
}
Josip Medved
la source
29
Vous ne devriez pas avoir besoin d'utiliser la réflexion - cela semble trop compliqué étant donné les méthodes plus simples disponibles.
Charlie Salts le
Cette solution ne fonctionne pas en C # / Windows Phone .NETCF --GetManifestResourceNames () ne renvoie qu'un seul nom, celui du module DLL d'assemblage. Il n'y a qu'une seule ressource disponible dans le manifeste - le blob de flux du module DLL. Sans C ++ et un code dangereux vous permettant d'appeler les appels de l'API Win32, c'est vraiment une douleur royale dans le cul de travailler avec ce morceau de mémoire.
Mark Jones
2
Vous pouvez également utiliser typeof(this).Assemblypour faire court.
Sri Harsha Chilakapati
1
@SriHarshaChilakapati typeof(this)ne fonctionnera pas. this.GetType().Assemblyest le plus proche de ce que vous avez dit, mais il est risqué car il reprendra une superclasse héritée qui peut être dans un assemblage différent.
John Gibb
2
@SriHarshaChilakapati typeof(this);ne compile pas. Vous obtenezError 1 Type expected
John Gibb
26

Bien plus facile que la plupart des réponses proposées

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
JDS
la source
1
Impossible d'accéder de cette façon si le fichier ne fait pas partie du manifeste de ressources car l'OP indique clairement qu'il est simplement ajouté en tant que fichier.
Wobbles
1
Il voulait aussi un Bitmapobjet, pas un Imageobjet.
vapcguy
13

Code que j'utilise dans plusieurs de mes projets ... Il suppose que vous stockez les images dans la ressource uniquement sous forme de bitmaps et non d'icônes

    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
la source
13

La meilleure chose est de les ajouter en tant que ressources d'image dans les paramètres de ressources du projet. Ensuite, vous pouvez obtenir l'image directement en faisant Resources.myimage. Cela obtiendra l'image via une propriété C # générée.

Si vous définissez simplement l'image comme ressource intégrée, vous pouvez l'obtenir avec:

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

Où MyTypeFromSameAssemblyAsResource est n'importe quel type que vous avez dans votre assembly.

Hallgrim
la source
1
"namespace" ne peut pas être utilisé comme nom de variable et la façon dont vous arrivez à MyTypeFromSameAssemblyAsResource serait appréciée.
Jason Fuerstenberg
correction de la faute de frappe sur le problème de Jason
John Gibb
6

Utilisez ci-dessous un. J'ai testé cela avec la cellule de vue Grille du formulaire Windows.

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

Nom de "Resource_Image", que vous pouvez trouver dans le projet.

Sous le nom du projet, vous pouvez trouver Properties. Développez-le. Là, vous pouvez voir le Resources.resxfichier. Ouvrez-le. Appliquez votre nom de fichier comme "Resource_Image".

Dzero
la source
5

Avec et ImageBox nommé "ImagePreview FormStrings.MyImageNames contient une méthode de conversion de chaîne get / set régulière, qui sont liées à une liste de types de boîte de défilement. Les images ont les mêmes noms que les noms liés dans la liste, à l'exception des terminaisons .bmp. Toutes les bitmaps sont glissés dans le resources.resx

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

Dans mon cas, j'utilisais des icônes dans ma ressource, mais je devais les ajouter dynamiquement en tant qu'images à certaines ToolStripMenuItem. Donc, dans la méthode que j'ai créée (d'où provient l'extrait de code ci-dessous), j'ai dû convertir les ressources des icônes en bitmaps avant de pouvoir les renvoyer pour les ajouter à mon MenuItem.

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

Autre chose à savoir, si votre image / icône a des espaces ("") dans son nom lorsque vous les ajoutez à votre ressource, VS remplacera automatiquement ces espaces par "_" (s). Parce que les espaces ne sont pas un caractère valide lorsque vous nommez votre ressource. C'est pourquoi j'utilise la Replace()méthode dans mon code référencé. Vous pouvez probablement ignorer cette ligne.

DSmith
la source
5

Je suggère:

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

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

Il est préférable d'utiliser Image.FromStream car vous n'avez pas besoin de connaître le format de l'image (bmp, png, ...).

Davide Icardi
la source
5

La réponse de JDS a fonctionné le mieux. Exemple d'image de chargement C #:

  • Inclure l'image en tant que ressource (arborescence du projet-> Ressources, clic droit pour ajouter le fichier souhaité ImageName.png)
  • Ressource intégrée (arborescence du projet-> Ressources-> ImageName.png, cliquez avec le bouton droit sur sélectionnez les propriétés)
  • Format de fichier .png (.bmp .jpg devrait également être OK)

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

Notez les points suivants:

  • Le fichier image de ressource est "ImageName.png", l'extension de fichier doit être omise.
  • ProjectName peut peut-être être plus adéquatement compris comme "Nom de l'assembly", qui doit être l'entrée de texte respective sur la page Projet-> Propriétés.

L'exemple de ligne de code est exécuté avec succès à l'aide de la communauté VisualStudio 2015.

user3674642
la source
4

Vous pouvez également enregistrer le bmp dans un var comme celui-ci:

var bmp = Resources.ImageName;

J'espère que ça aide!

F.joksch
la source
2

Curieusement, après avoir fouillé dans le concepteur, je trouve ce qui semble être une approche beaucoup plus simple:

L'image semble être disponible à partir de .Properties.Resources.

J'utilise simplement une image car tout ce qui m'intéresse, c'est de la coller dans un contrôle avec une image dessus.

(Net 4.0, VS2010.)

Loren Pechtel
la source
2

J'ai regardé le code du concepteur de l'un de mes projets et j'ai remarqué qu'il utilisait cette notation

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

où max est le nom de la ressource que j'ai téléchargée dans le projet.

Andrew Stein
la source
1

Ou vous pouvez utiliser cette ligne lorsque vous traitez avec WPF ou Silverlight, en particulier lorsque vous avez déjà la chaîne source dans le balisage XAML:

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

Où ImagePath est quelque chose comme:

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";
TChadwick
la source
-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
la source