2009-07-28 40 views
167

tengo una imagen en mi proyecto almacenado en Recursos/myimage.jpg. ¿Cómo puedo cargar dinámicamente esta imagen en un objeto Bitmap?Cargar imagen del área de recursos del proyecto en C#

+1

mirada a esta respuesta: http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/7375570#7375570 – Roland

+0

Esta fue una pregunta eso se preguntó más tarde, pero está relacionado, si no es un duplicado: http://stackoverflow.com/questions/13592150/load-image-from-resources – vapcguy

Respuesta

198

¿Está utilizando Windows Forms? Si ha añadido la imagen utilizando el/Recursos interfaz de usuario Propiedades, se obtiene acceso a la imagen del código generado, por lo que simplemente puede hacer esto:

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

No, se agrega como un archivo simple en la carpeta Recursos. –

+8

Ah bien. En ese caso, creo que @Hallgrim tiene la respuesta para ti usando flujos de recursos. Si * estás * usando Windows Forms, te recomiendo que elimines la imagen y la vuelvas a agregar desde la interfaz de usuario, mucho más fácil. –

97

se puede obtener una referencia a la imagen de la siguiente manera:

Image myImage = Resources.myImage; 

Si desea hacer una copia de la imagen, tendrá que hacer lo siguiente:

Bitmap bmp = new Bitmap(Resources.myImage); 

no se olvide de eliminar o f bmp cuando haya terminado con él. Si no conoce el nombre de la imagen de recursos en tiempo de compilación, puede utilizar un gestor de recursos:

ResourceManager rm = Resources.ResourceManager; 
Bitmap myImage = (Bitmap)rm.GetObject("myImage"); 

El beneficio de la ResourceManager es que se puede utilizar es donde Resources.myImage sería normalmente a cabo de alcance, o donde quiera acceder dinámicamente a los recursos. Además, esto funciona para sonidos, archivos de configuración, etc.

+12

Nota: use Properties.Resources.myImage; – splattne

+0

Estoy tratando de vincular el objeto de recurso a mi cuadrícula de datos, pero no se muestra con su método. La columna de la imagen de cuadrícula de datos está templada. – alice7

63

Es necesario que cargarlo desde secuencia de recursos.

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

Si quieres saber todos los nombres de recursos en su ensamblaje, ir con:

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

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

No debería necesitar usar la reflexión, esto parece demasiado complicado dados los métodos más simples disponibles. –

+0

Esta solución no funciona en C#/Windows Phone .NETCF --GetManifestResourceNames() solo devuelve un único nombre, el del módulo ensamblador-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 API de Win32, es francamente un real dolor en el culo trabajar con este pedazo de memoria. –

+2

También puede usar 'typeof (this) .Assembly' para abreviar. –

13

Lo mejor es añadir 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 acaba de configurar la imagen como recurso incrustado se puede obtener 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)); 

Dónde MyTypeFromSameAssemblyAsResource es cualquier tipo que usted tiene en su montaje.

+2

¿Qué es' tipo'? – radbyx

+1

"namespace" no se puede utilizar como nombre de variable y se agradecerá la forma de llegar a MyTypeFromSameAssemblyAsResource. –

+0

corrigió el error al escribir el problema de Jason –

5

con y ImageBox llamado "ImagePreview FormStrings.MyImageNames contiene un conjunto método get elenco regular de/string, que están vinculados a una lista de tipos scrollbox. Las imágenes tienen los mismos nombres que los nombres vinculados en la lista, a excepción de las terminaciones. .bmp Todos los mapas de bits se ven arrastradas al resources.resx

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

Curiosamente, desde hurgando en el diseñador encuentro lo que parece ser un enfoque mucho más simple:

la imagen parece haber disponible desde .Properties.Resources.

Simplemente estoy usando una imagen ya que todo lo que me interesa es pegarla en un control con una imagen.

(Net 4.0, VS2010.)

24

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

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

No se puede acceder de esa manera si el archivo no es parte del manifiesto de recursos ya que el OP indica claramente que se acaba de agregar como un archivo. – Wobbles

+0

También quería un objeto 'Bitmap', no un objeto' Image'. – vapcguy

4

En mi caso - que estaba usando iconos en mi recurso, pero necesitaba agregarlos dinámicamente a medida que Imágenes hasta cierto ToolStripMenuItem (s) Entonces, en el método que creé (que es de donde proviene el siguiente fragmento de código), 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(); 

Otra cosa a tener en cuenta, si su imagen/icono tiene espacios (" ") en su nombre cuando se agregan 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. Por eso estoy usando el método Replace() en mi código de referencia. Es probable que simplemente ignores esa línea.

9

Código utilizo en varios de mis proyectos ... Asume que permite almacenar imágenes en recursos no sólo como mapas de bits iconos

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

    } 
+0

Esto es muy agradable. Gracias :) – Derrick

3

que sugiero:

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

Usar Image.FromStream es mejor porque no necesita conocer el formato de la imagen (bmp, png, ...).

2

Miré el código del diseñador de uno de mis proyectos y notamos que utiliza esta notación

myButton.Image = global::MyProjectName.Properties.Resources.max; 

donde max es el nombre del recurso que he subido en el proyecto.

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

O usted podría utilizar esta línea cuando se trata de WPF o Silverlight, especialmente cuando usted tiene la cadena de origen ya en el marcado XAML:

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

Cuando el ImagePath es algo así como:

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

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

  • Incluir la imagen como en recursos (Proyecto de árboles> Recursos, haga clic derecho para añadir el archivo ImageName.png deseable)
  • Recurso incrustado (Proyecto de árboles> Recursos-> ImageName.png , haga clic derecho seleccione propiedades)
  • formato de archivo .png (.bmp .jpg también debe estar bien)

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

nota lo siguiente:

  • El archivo de imagen de recurso es "NombreDeImagen.png", la extensión de archivo debe omitirse.
  • ProjectName quizás se entienda más adecuadamente como "Nombre de ensamblado", que debe ser el ingreso de texto respectivo en la página Proyecto-> Propiedades.

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

2

También puede guardar la BMP en una var así:

var bmp = Resources.ImageName; 

espero que ayude!

Cuestiones relacionadas