Cargar imagen del área de recursos del proyecto en C #

Respuestas:

242

¿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);
Matt Hamilton
fuente
No, se agrega como un archivo simple a la carpeta Recursos.
Pavel Bastov
99
Ah ok En ese caso, creo que @ Hallgrim tiene la respuesta para ti usando flujos de recursos. Si está utilizando Windows Forms, le insto a que elimine la imagen y la vuelva a agregar desde la interfaz de usuario, mucho más fácil de esa manera.
Matt Hamilton
114

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.

Sales de Charlie
fuente
17
Nota: use Properties.Resources.myImage;
splattne
Estoy tratando de vincular el objeto de recurso a mi cuadrícula de datos pero no aparece usando su método. La columna de la imagen de la cuadrícula de datos está en plantilla.
alice7
70

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);
}
Josip Medved
fuente
29
No debería necesitar usar la reflexión; esto parece demasiado complicado dados los métodos más simples disponibles.
Charlie Sales
Esta solución no funciona en C # / Windows Phone .NETCF --GetManifestResourceNames () solo devuelve un solo nombre, el del módulo de ensamblaje-DLL. Solo hay un recurso disponible en el manifiesto: el blob de flujo del módulo DLL. Sin C ++ y el código inseguro que le permite llamar a las llamadas a la API de Win32, francamente es un verdadero problema trabajar con esta porción de memoria.
Mark Jones
2
También puedes usar typeof(this).Assemblypara abreviar.
Sri Harsha Chilakapati
1
@SriHarshaChilakapati typeof(this)no funcionará. this.GetType().Assemblyes lo más cercano a lo que dijo, pero es arriesgado porque recogerá una superclase heredada que puede estar en un ensamblaje diferente.
John Gibb
2
@SriHarshaChilakapati typeof(this);no compila. Usted obtieneError 1 Type expected
John Gibb
26

Mucho más fácil que la mayoría de las respuestas propuestas

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
JDS
fuente
1
No se puede acceder de esa manera si el archivo no es parte del manifiesto de recursos, ya que el OP indica claramente que solo se agrega como un archivo.
tambalea el
1
También quería un Bitmapobjeto, no un Imageobjeto.
vapcguy
13

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

    }
Gary Kindel
fuente
13

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.

Hallgrim
fuente
1
El "espacio de nombres" no se puede usar como nombre de variable y se agradecerá cómo llegar a MyTypeFromSameAssemblyAsResource.
Jason Fuerstenberg
solucionó el error tipográfico que abordaba el problema de Jason
John Gibb
6

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.resxarchivo. Abrelo. Aplique su nombre de archivo como "Resource_Image".

Dzero
fuente
5

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;
Violador
fuente
5

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.

DSmith
fuente
5

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

Davide Icardi
fuente
5

La respuesta de JDS funcionó mejor. C # ejemplo cargando imagen:

  • Incluya la imagen como Recurso (Árbol del proyecto-> Recursos, haga clic derecho para agregar el archivo deseable ImageName.png)
  • Recurso incorporado (Árbol del proyecto-> Recursos-> ImageName.png, haga clic derecho en seleccionar propiedades)
  • Formato de archivo .png (.bmp .jpg también debería estar bien)

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

Tenga en cuenta lo siguiente:

  • El archivo de imagen del recurso es "ImageName.png", la extensión del archivo debe omitirse.
  • ProjectName puede entenderse más adecuadamente como "Nombre de ensamblado", que debe ser la entrada de texto respectiva en la página Proyecto-> Propiedades.

La línea de código de ejemplo se ejecuta correctamente con VisualStudio 2015 Community.

usuario3674642
fuente
4

También puede guardar el bmp en una variable como esta:

var bmp = Resources.ImageName;

¡Espero eso ayude!

F.joksch
fuente
2

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

Loren Pechtel
fuente
2

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.

Andrew Stein
fuente
1

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";
TChadwick
fuente
-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);
Programador IR.
fuente