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


Answers:


242

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

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

不,它将作为纯文件添加到资源文件夹中。
帕维尔·巴斯托夫

9
喔好吧。在那种情况下,我认为@Hallgrim使用资源流为您找到了答案。如果您使用Windows窗体我会劝你要删除的图像,并将其从UI重新添加-更容易的方式。
马特·汉密尔顿,

114

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

Image myImage = Resources.myImage;

如果要复制图像,则需要执行以下操作:

Bitmap bmp = new Bitmap(Resources.myImage);

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

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

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


17
注意:使用Properties.Resources.myImage;
splattne 2010年

我正在尝试将资源对象绑定到我的数据网格,但是使用您的方法却没有显示。datagrid image列已模板化。
alice7 2011年

70

您需要从资源流中加载它。

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

29
您不需要使用反射-考虑到可用的简单方法,这似乎过于复杂。
查理·萨尔斯

此解决方案在C#/ Windows Phone中不起作用。.NETCF --GetManifestResourceNames()仅返回单个名称,即Assembly-DLL模块的名称。清单中只有一种资源可用-DLL模块的流blob。没有C ++和不安全的代码,您无法调用Win32 API调用,坦率地说,使用此内存块是一件麻烦事。
马克·琼斯

2
您也可以typeof(this).Assembly简称。
Sri Harsha Chilakapati

1
@SriHarshaChilakapati typeof(this)无法正常工作。this.GetType().Assembly是最接近您说的内容,但是这样做有风险,因为它会继承继承的超类,而继承的超类可能在不同的程序集中。
约翰·吉布

2
@SriHarshaChilakapati typeof(this);无法编译。您会收到Error 1 Type expected
John Gibb 2014年

26

比大多数建议的答案更容易

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

1
如果文件不是资源清单的一部分,则无法以这种方式访问​​,因为OP明确指出它只是作为文件添加的。
摆动

1
他还想要一个Bitmap物体,而不是Image物体。
vapcguy

13

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

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

    }

13

最好的办法是在“项目”的“资源”设置中将它们添加为“图像资源”。然后,您可以通过执行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是程序集中具有的任何类型。


1
“名称空间”不能用作变量名称,您将如何到达MyTypeFromSameAssemblyAsResource。
杰森·弗森伯格

修复了解决Jason问题的错字
John Gibb,2014年

6

使用以下一项。我已经使用Windows窗体的Grid View单元对此进行了测试。

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

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

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


5

使用和命名为“ ImagePreview FormStrings.MyImageNames”的ImageBox包含常规的get / set字符串转换方法,这些方法链接到滚动框类型列表。图像的名称与列表上的链接名称相同,除了.bmp结尾。位图被拖到resources.resx中

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

5

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

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

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



5

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

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

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

请注意以下几点:

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

使用Visual Studio 2015社区成功运行了示例代码行。


4

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

var bmp = Resources.ImageName;

希望能帮助到你!


2

奇怪的是,从找设计师开始,我发现似乎更简单的方法是:

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

我只是使用图像,因为我感兴趣的只是将其粘贴到带有图像的控件中。

(Net 4.0,VS2010。)


2

我从一个项目中查看了设计器代码,并注意到它使用了这种表示法

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

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


1

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

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

ImagePath类似于:

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

-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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.