在C#中从项目资源区加载图像

时间:2009-07-28 05:20:55

标签: c# image winforms load

我的项目中存有一个存储在Resources / myimage.jpg中的图像。如何将此图像动态加载到Bitmap对象中?

16 个答案:

答案 0 :(得分:227)

您使用的是Windows窗体吗?如果您使用“属性/资源”UI添加了图像,则可以从生成的代码中访问图像,因此您只需执行此操作:

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

答案 1 :(得分:106)

您可以通过以下方式获得对图像的引用:

Image myImage = Resources.myImage;

如果您想制作图像的副本,则需要执行以下操作:

Bitmap bmp = new Bitmap(Resources.myImage);

完成后不要忘记处理 bmp 。如果在编译时不知道资源映像的名称,则可以使用资源管理器:

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

ResourceManager的好处是,您可以在Resources.myImage通常超出范围或您想要动态访问资源的位置使用它。此外,这适用于声音,配置文件等。

答案 2 :(得分:68)

您需要从资源流加载它。

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

如果您想知道程序集中的所有资源名称,请使用:

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

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

答案 3 :(得分:25)

比大多数所有提议的答案都更容易

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

答案 4 :(得分:13)

最好的方法是在Project的Resources设置中将它们添加为Image Resources。然后,您可以通过Resources.myimage直接获取图像。这将通过生成的C#属性获取图像。

如果您只是将图像设置为嵌入式资源,则可以使用:

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

MyTypeFromSameAssemblyAsResource是程序集中的任何类型。

答案 5 :(得分:12)

我在我的几个项目中使用的代码...... 它假定您仅将图像存储在资源中作为位图而不是图标

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

    }

答案 6 :(得分:5)

使用和ImageBox命名为“ImagePreview FormStrings.MyImageNames包含一个常规的get / set字符串强制转换方法,它们链接到一个滚动框类型列表。 除了.bmp结尾外,图像的名称与列表中的链接名称相同。 所有位图都会被拖入resources.resx

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

答案 7 :(得分:5)

就我而言 - 我在我的资源中使用图标,但我需要将它们动态添加为图像到某些ToolStripMenuItem(s)。因此,在我创建的方法(下面的代码片段来自哪里)中,我必须将图标资源转换为位图,然后才能将它们返回到我的MenuItem

string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();

要注意的是,如果您的图像/图标在将其添加到资源时在其名称中包含空格(“”),VS将自动将这些空格替换为“_”(s)。因为,在命名资源时,空格不是有效字符。这就是我在引用的代码中使用Replace()方法的原因。您可能只是忽略该行。

答案 8 :(得分:5)

使用下面的一个。我已经使用Windows窗体的网格视图单元格对此进行了测试。

Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;

“Resource_Image”的名称,您可以从项目中找到。

在项目名称下,您可以找到Properties。展开它。在那里你可以看到Resources.resx文件。打开它。将您的文件名应用为“Resource_Image”。

答案 9 :(得分:4)

我建议:

System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
Image yourImage = Image.FromStream(file);

来自msdn: http://msdn.microsoft.com/en-us/library/aa287676(v=vs.71).aspx

使用Image.FromStream更好,因为您不需要知道图像的格式(bmp,png,...)。

答案 10 :(得分:4)

JDS的答案效果最好。 C#示例加载图片:

  • 将图像包含为资源(项目树 - >资源,右键单击以添加所需文件ImageName.png)
  • 嵌入式资源(项目树 - >资源 - > ImageName.png,右键单击选择属性)
  • .png文件格式(.bmp .jpg也应该没问题)

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

请注意以下事项:

  • 资源图像文件为“ImageName.png”,文件扩展名应省略。
  • ProjectName可能更适合理解为“程序集名称”,它是Project-> Properties页面上的相应文本条目。

使用VisualStudio 2015社区成功运行示例代码行。

答案 11 :(得分:3)

你也可以将bmp保存在这样的var中:

var bmp = Resources.ImageName;
希望它有所帮助!

答案 12 :(得分:2)

奇怪的是,从设计师的角度来看,我发现了一个看起来更简单的方法:

图像似乎可从.Properties.Resources获得。

我只是使用一个图像,因为我感兴趣的是将它粘贴到一个带有图像的控件上。

(Net 4.0,VS2010。)

答案 13 :(得分:2)

我查看了我的一个项目中的设计器代码,发现它使用了这种表示法

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

其中max是我上传到项目中的资源的名称。

答案 14 :(得分:1)

或者您可以在处理WPF或Silverlight时使用此行,尤其是在XAML标记中已有源字符串的情况下:

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

ImagePath的位置如下:

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

答案 15 :(得分:-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);