Tengo una imagen en mi proyecto almacenada en Resources / myimage.jpg. ¿Cómo puedo cargar dinámicamente esta imagen en un objeto de mapa de bits?
Tengo una imagen en mi proyecto almacenada en Resources / myimage.jpg. ¿Cómo puedo cargar dinámicamente esta imagen en un objeto de mapa de bits?
Respuestas:
¿Estás utilizando formularios Windows Forms? Si ha agregado la imagen usando la interfaz de usuario de Propiedades / Recursos, obtiene acceso a la imagen desde el código generado, por lo que simplemente puede hacer esto:
var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Puede obtener una referencia a la imagen de la siguiente manera:
Image myImage = Resources.myImage;
Si desea hacer una copia de la imagen, deberá hacer lo siguiente:
Bitmap bmp = new Bitmap(Resources.myImage);
No olvide deshacerse de bmp cuando haya terminado con él. Si no conoce el nombre de la imagen del recurso en tiempo de compilación, puede usar un administrador de recursos:
ResourceManager rm = Resources.ResourceManager;
Bitmap myImage = (Bitmap)rm.GetObject("myImage");
El beneficio del ResourceManager es que puede usarlo donde Resources.myImage normalmente estaría fuera del alcance, o donde desea acceder dinámicamente a los recursos. Además, esto funciona para sonidos, archivos de configuración, etc.
Necesita cargarlo desde la secuencia de recursos.
Bitmap bmp = new Bitmap(
System.Reflection.Assembly.GetEntryAssembly().
GetManifestResourceStream("MyProject.Resources.myimage.png"));
Si desea conocer todos los nombres de recursos en su ensamblaje, vaya con:
string[] all = System.Reflection.Assembly.GetEntryAssembly().
GetManifestResourceNames();
foreach (string one in all) {
MessageBox.Show(one);
}
typeof(this).Assembly
para abreviar.
typeof(this)
no funcionará. this.GetType().Assembly
es lo más cercano a lo que dijo, pero es arriesgado porque recogerá una superclase heredada que puede estar en un ensamblaje diferente.
typeof(this);
no compila. Usted obtieneError 1 Type expected
Mucho más fácil que la mayoría de las respuestas propuestas
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
objeto, no un Image
objeto.
Código que uso en varios de mis proyectos ... Asume que almacena imágenes en recursos solo como mapas de bits, no íconos
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);
}
Lo mejor es agregarlos como Recursos de imagen en la configuración de Recursos en el Proyecto. Luego puede obtener la imagen directamente haciendo Resources.myimage. Esto obtendrá la imagen a través de una propiedad C # generada.
Si solo configura la imagen como recurso integrado, puede obtenerla con:
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));
Donde MyTypeFromSameAssemblyAsResource es cualquier tipo que tenga en su ensamblado.
Use debajo de uno. He probado esto con la celda de vista de cuadrícula del formulario de Windows.
Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;
Nombre de "Resource_Image", que puedes encontrar en el proyecto.
Debajo del nombre del proyecto, puedes encontrar Properties
. Expandelo. Allí puedes ver el Resources.resx
archivo. Abrelo. Aplique su nombre de archivo como "Resource_Image".
Con y ImageBox llamado "ImagePreview FormStrings.MyImageNames contiene un método regular de conversión de cadena get / set, que están vinculados a una lista de tipos de cuadro de desplazamiento. Las imágenes tienen los mismos nombres que los nombres vinculados en la lista, excepto las terminaciones .bmp. Todos los mapas de bits se arrastran a los recursos.resx
Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames);
Bitmap myImage = (Bitmap)rm;
ImagePreview.Image = myImage;
En mi caso, estaba usando iconos en mi recurso, pero necesitaba agregarlos dinámicamente como imágenes a algunos ToolStripMenuItem
. Entonces, en el método que creé (que es de donde proviene el fragmento de código a continuación), tuve que convertir los recursos del icono en mapas de bits antes de poder devolverlos para agregarlos a mi MenuItem
.
string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();
Algo más a tener en cuenta, si su imagen / icono tiene espacios ("") en su nombre cuando los agrega a su recurso, VS reemplazará automáticamente esos espacios con "_" (s). Porque, los espacios no son un carácter válido al nombrar su recurso. Es por eso que estoy usando el Replace()
método en mi código referenciado. Probablemente puedas ignorar esa línea.
Yo sugiero:
System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file =
thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
Image yourImage = Image.FromStream(file);
Desde msdn: http://msdn.microsoft.com/en-us/library/aa287676(v=vs.71).aspx
Usar Image.FromStream es mejor porque no necesita saber el formato de la imagen (bmp, png, ...).
La respuesta de JDS funcionó mejor. C # ejemplo cargando imagen:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Tenga en cuenta lo siguiente:
La línea de código de ejemplo se ejecuta correctamente con VisualStudio 2015 Community.
Por extraño que parezca, al hurgar en el diseñador, encuentro lo que parece ser un enfoque mucho más simple:
La imagen parece estar disponible en .Properties.Resources.
Simplemente estoy usando una imagen, ya que todo lo que me interesa es pegarla en un control con una imagen en ella.
(Neto 4.0, VS2010.)
Miré el código del diseñador de uno de mis proyectos y noté que usaba esta notación
myButton.Image = global::MyProjectName.Properties.Resources.max;
donde max es el nombre del recurso que cargué en el proyecto.
O podría usar esta línea cuando trabaje con WPF o Silverlight, especialmente cuando ya tiene la cadena de origen en el marcado XAML:
(ImageSource)new ImageSourceConverter().ConvertFromString(ImagePath);
Donde ImagePath es algo así como:
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);