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

Pav*_*tov 206 c# load image winforms

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

Mat*_*ton 237

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

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Run Code Online (Sandbox Code Playgroud)

  • 喔好吧.在那种情况下,我认为@ Hallgrim使用资源流得到了答案.如果您*使用Windows窗体我会敦促您删除图像并从UI重新添加 - 这样更容易. (9认同)

Cha*_*lts 110

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

Image myImage = Resources.myImage;
Run Code Online (Sandbox Code Playgroud)

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

Bitmap bmp = new Bitmap(Resources.myImage);
Run Code Online (Sandbox Code Playgroud)

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

ResourceManager rm = Resources.ResourceManager;
Bitmap myImage = (Bitmap)rm.GetObject("myImage");
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:使用Properties.Resources.myImage; (16认同)

Jos*_*ved 69

您需要从资源流加载它.

Bitmap bmp = new Bitmap(
  System.Reflection.Assembly.GetEntryAssembly().
    GetManifestResourceStream("MyProject.Resources.myimage.png"));
Run Code Online (Sandbox Code Playgroud)

如果要了解程序集中的所有资源名称,请执行以下操作:

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

foreach (string one in all) {
    MessageBox.Show(one);
}
Run Code Online (Sandbox Code Playgroud)

  • 你不应该使用反射 - 考虑到更简单的方法,这似乎过于复杂. (27认同)
  • 您也可以使用`typeof(this).Assembly`. (2认同)
  • @SriHarshaChilakapati `typeof(this)` 将不起作用。`this.GetType().Assembly` 与您所说的最接近,但它有风险,因为它会选择可能位于不同程序集中的继承超类。 (2认同)
  • @SriHarshaChilakapati`typeof(this);`不编译.你得到'错误1类型预期` (2认同)

小智 25

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

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Run Code Online (Sandbox Code Playgroud)


Hal*_*rim 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));
Run Code Online (Sandbox Code Playgroud)

其中MyTypeFromSameAssemblyAsResource是程序集中的任何类型.

  • 什么是"类型"? (2认同)

Gar*_*del 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);

    }
Run Code Online (Sandbox Code Playgroud)


use*_*642 6

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

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

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

请注意以下事项:

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

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


小智 6

您还可以将 bmp 保存在 var 中,如下所示:

var bmp = Resources.ImageName;
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


小智 6

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

Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;
Run Code Online (Sandbox Code Playgroud)

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

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


小智 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;
Run Code Online (Sandbox Code Playgroud)


小智 5

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

string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();
Run Code Online (Sandbox Code Playgroud)

还有一点要注意,如果你的图像/图标在你的资源中添加了它们的名字时会有空格(""),VS会自动用"_"代替这些空格.因为,在命名资源时,空格不是有效字符.这就是为什么我Replace()在引用的代码中使用该方法.您可能只是忽略该行.


Dav*_*rdi 5

我建议:

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

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

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