J'ai une image dans mon projet stockée dans Resources / myimage.jpg. Comment puis-je charger dynamiquement cette image dans un objet Bitmap?
J'ai une image dans mon projet stockée dans Resources / myimage.jpg. Comment puis-je charger dynamiquement cette image dans un objet Bitmap?
Réponses:
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);
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.
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);
}
typeof(this).Assembly
pour faire court.
typeof(this)
ne fonctionnera pas. this.GetType().Assembly
est 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.
typeof(this);
ne compile pas. Vous obtenezError 1 Type expected
Bien plus facile que la plupart des réponses proposées
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
objet, pas un Image
objet.
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);
}
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.
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.resx
fichier. Ouvrez-le. Appliquez votre nom de fichier comme "Resource_Image".
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;
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.
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, ...).
La réponse de JDS a fonctionné le mieux. Exemple d'image de chargement C #:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Notez les points suivants:
L'exemple de ligne de code est exécuté avec succès à l'aide de la communauté VisualStudio 2015.
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.)
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.
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";
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);