web-dev-qa-db-fra.com

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

J'ai une image dans mon projet stockée dans Resources/myimage.jpg. Comment puis-je charger dynamiquement cette image dans un objet Bitmap?

202
Pavel Bastov

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 le faire simplement:

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

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

Image myImage = Resources.myImage;

Si vous souhaitez créer une copie de l'image, procédez comme suit:

Bitmap bmp = new Bitmap(Resources.myImage);

N'oubliez pas de vous débarrasser de bmp lorsque vous avez terminé. Si vous ne connaissez pas le nom de l'image de la 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 de ResourceManager est que vous pouvez l'utiliser là où Ressources.myImage serait normalement hors de portée ou lorsque vous souhaitez accéder de manière dynamique à des ressources. De plus, cela fonctionne pour les sons, les fichiers de configuration, etc.

109
Charlie Salts

Vous devez le charger depuis le flux de ressources.

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

Si vous voulez connaître tous les noms de ressources de votre assemblée, procédez comme suit:

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

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

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

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

La meilleure chose à faire 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 effectuant Ressources.myimage. Cela permettra d'obtenir l'image via une propriété C # générée.

Si vous définissez simplement l'image en tant que ressource incorporé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 un type que vous avez dans votre assembly.

13
Hallgrim

Code que j'utilise dans plusieurs de mes projets ... Il suppose que vous stockez des images dans des ressources 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);

    }
12
Gary Kindel

Utilisez ci-dessous un. J'ai testé cela avec la cellule vue grille de Windows form.

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

Nom de "Resource_Image", vous pouvez trouver du projet.

Sous le nom du projet, vous pouvez trouver Properties. Développez-le. Vous pouvez y voir le fichier Resources.resx. Ouvrez-le. Appliquez votre nom de fichier en tant que "image_ressource".

6
Dzero

With et ImageBox nommé "ImagePreview FormStrings.MyImageNames contient une méthode de conversion de chaîne get/set standard, qui sont liées à une liste de types de boîtes de défilement. Les images portent les mêmes noms que les noms liés dans la liste, à l'exception des fins .bmp. Tous les bitmaps sont glissés dans le fichier resources.resx

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

Dans mon cas, j’utilisais Icônes dans ma ressource, mais j’avais besoin de les ajouter dynamiquement sous la forme Images à une certaine ToolStripMenuItem (s). Ainsi, dans la méthode que j'ai créée (d'où provient l'extrait de code ci-dessous), j'ai dû convertir les ressources de l'icône 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 élément à prendre en compte, si votre image/icône comporte des espaces ("") dans son nom lorsque vous les ajoutez à votre ressource, VS remplacera automatiquement ces espaces par "_". Parce que les espaces ne sont pas un caractère valide lorsque vous nommez votre ressource. C'est pourquoi j'utilise la méthode Replace() dans mon code de référence. Vous pouvez probablement simplement ignorer cette ligne.

5
DSmith

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

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

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

Notez les points suivants:

  • Le fichier image de la ressource est "ImageName.png", son extension doit être omise.
  • ProjectName pourrait 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 VisualStudio 2015 Community.

4
user3674642

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

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

4
Davide Icardi

Vous pouvez aussi sauvegarder le bmp dans une var comme ceci:

var bmp = Resources.ImageName;

j'espère que ça aide!

3
F.joksch

Curieusement, en fouillant chez le designer, 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
Loren Pechtel

J'ai regardé le code du concepteur de l'un de mes projets et 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.

2
Andrew Stein

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

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

Où ImagePath ressemble à quelque chose comme:

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";
1
TChadwick