Load image from resources area of project in C#

Viewed 576866

I have an image in my project stored at Resources/myimage.jpg. How can I dynamically load this image into Bitmap object?

16 Answers

Are you using Windows Forms? If you've added the image using the Properties/Resources UI, you get access to the image from generated code, so you can simply do this:

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

You can get a reference to the image the following way:

Image myImage = Resources.myImage;

If you want to make a copy of the image, you'll need to do the following:

Bitmap bmp = new Bitmap(Resources.myImage);

Don't forget to dispose of bmp when you're done with it. If you don't know the name of the resource image at compile-time, you can use a resource manager:

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

The benefit of the ResourceManager is that you can use it where Resources.myImage would normally be out of scope, or where you want to dynamically access resources. Additionally, this works for sounds, config files, etc.

You need to load it from resource stream.

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

If you want to know all resource names in your assembly, go with:

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

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

The best thing is to add them as Image Resources in the Resources settings in the Project. Then you can get the image directly by doing Resources.myimage. This will get the image via a generated C# property.

If you just set the image as Embedded Resource you can get it with:

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

Where MyTypeFromSameAssemblyAsResource is any type that you have in your assembly.

I looked at the designer code from one of my projects and noticed it used this notation

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

where max is the name of the resource I uploaded into the project.

Related