240 votes

Charger une image depuis la zone des ressources du projet en C#

Dans mon projet, j'ai une image stockée à l'adresse Resources/myimage.jpg. Comment puis-je charger dynamiquement cette image dans un objet Bitmap ?

1 votes

Regardez cette réponse : stackoverflow.com/questions/94456/

0 votes

Cette question a été posée plus tard, mais elle est liée, voire identique : stackoverflow.com/questions/13592150/load-image-from-resources

273voto

Matt Hamilton Points 98268

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

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

0 votes

Non, il est ajouté comme un simple fichier dans le dossier Ressources.

10 votes

Ah ok. Dans ce cas, je pense que @Hallgrim a la réponse pour vous en utilisant les flux de ressources. Si vous sont Si vous utilisez Windows Forms, je vous conseille vivement de supprimer l'image et de la réinsérer à partir de l'interface utilisateur - c'est beaucoup plus facile ainsi.

126voto

Charlie Salts Points 5958

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

Image myImage = Resources.myImage;

Si vous voulez faire un copie de l'image, vous devrez faire ce qui suit :

Bitmap bmp = new Bitmap(Resources.myImage);

N'oubliez pas de vous débarrasser de bmp quand vous en aurez fini avec elle. 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 du ResourceManager est que vous pouvez l'utiliser lorsque Resources.myImage serait normalement hors de portée, ou lorsque vous voulez accéder dynamiquement aux ressources. En outre, cela fonctionne pour les sons, les fichiers de configuration, etc.

26 votes

Remarque : utilisez Properties.Resources.myImage ;

1 votes

J'essaie de lier l'objet ressource à ma grille de données mais il ne s'affiche pas en utilisant votre méthode. La colonne image de la grille de données est modélisée.

75voto

Josip Medved Points 2307

Vous devez le charger à partir du 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 dans votre assemblage, allez-y avec :

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

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

34 votes

Vous ne devriez pas avoir besoin d'utiliser la réflexion - cela semble trop compliqué étant donné les méthodes plus simples disponibles.

0 votes

Cette solution ne fonctionne pas en C# / Windows Phone .NETCF --GetManifestResourceNames() ne renvoie qu'un seul nom, celui du module DLL de l'assemblage. Il n'y a qu'une seule ressource disponible dans le manifeste : le blob de flux du module DLL. En l'absence de code C++ et de code non sécurisé permettant d'appeler les API Win32, il est franchement très difficile de travailler avec ce gros morceau de mémoire.

2 votes

Vous pouvez également utiliser typeof(this).Assembly pour faire court.

28voto

JDS Points 171

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

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

2 votes

Impossible d'y accéder de cette façon si le fichier ne fait pas partie du manifeste des ressources, comme l'indique clairement le PO, il est juste ajouté en tant que fichier.

2 votes

Il voulait aussi un Bitmap et non un objet Image objet.

19voto

Hallgrim Points 7198

La meilleure chose à faire est de les ajouter en tant que ressources d'image dans les paramètres de ressources du projet. Vous pouvez ensuite obtenir l'image directement en faisant Resources.myimage. Cela permettra d'obtenir 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 tout type que vous avez dans votre assemblage.

1 votes

"namespace" ne peut pas être utilisé comme nom de variable et comment vous arrivez à MyTypeFromSameAssemblyAsResource serait apprécié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X