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

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.


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

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;

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

    }

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.


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".


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;

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.


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, ...).


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.


4

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

var bmp = Resources.ImageName;

J'espère que ça aide!


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


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.


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

-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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.