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

Posted

技术标签:

【中文标题】在 C# 中从项目的资源区域加载图像【英文标题】:Load image from resources area of project in C# 【发布时间】:2010-11-14 14:11:23 【问题描述】:

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

【问题讨论】:

看这个答案:***.com/questions/94456/… 这是一个后来被问到的问题,但如果不是重复的话,也是相关的:***.com/questions/13592150/load-image-from-resources 【参考方案1】:

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

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

【讨论】:

不,它作为纯文件添加到文件夹资源中。 嗯,好的。在这种情况下,我认为@Hallgrim 使用资源流为您提供了答案。如果您正在使用 Windows 窗体,我会敦促您删除图像并从 UI 中重新添加它 - 这样更容易。【参考方案2】:

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

Image myImage = Resources.myImage;

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

Bitmap bmp = new Bitmap(Resources.myImage);

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

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

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

【讨论】:

注意:使用 Properties.Resources.myImage; 我正在尝试将资源对象绑定到我的数据网格,但使用您的方法没有显示出来。数据网格图像列已模板化。【参考方案3】:

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

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

【讨论】:

你不应该使用反射——考虑到可用的更简单的方法,这似乎过于复杂。 此解决方案在 C#/Windows Phone .NETCF 中不起作用 --GetManifestResourceNames() 仅返回一个名称,即程序集 DLL 模块的名称。清单中只有一种资源可用——DLL 模块的流 blob。如果没有 C++ 和允许您调用 Win32 API 调用的不安全代码,坦率地说,使用这块内存是一件非常痛苦的事情。 也可以简称为typeof(this).Assembly @SriHarshaChilakapati typeof(this) 将不起作用。 this.GetType().Assembly 与您所说的最接近,但它有风险,因为它会拾取可能位于不同程序集中的继承超类。 @SriHarshaChilakapati typeof(this); 无法编译。你得到Error 1 Type expected【参考方案4】:

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

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

【讨论】:

如果文件不是资源清单的一部分,则无法以这种方式访问​​,因为 OP 明确指出它只是作为文件添加。 他还想要一个Bitmap 对象,而不是Image 对象。【参考方案5】:

最好将它们作为图像资源添加到项目的资源设置中。然后就可以直接通过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 是您在程序集中拥有的任何类型。

【讨论】:

"namespace" 不能用作变量名,您如何到达 MyTypeFromSameAssemblyAsResource 将不胜感激。 修正了解决 Jason 问题的错字【参考方案6】:

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

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

    

【讨论】:

【参考方案7】:

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

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

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

注意以下几点:

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

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

【讨论】:

【参考方案8】:

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

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

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

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

【讨论】:

【参考方案9】:

带有和ImageBox命名为“ImagePreview FormStrings.MyImageNames 包含一个常规的 get/set 字符串转换方法,该方法链接到一个滚动框类型列表。 这些图像与列表中的链接名称具有相同的名称,但 .bmp 结尾除外。 所有位图都拖到resources.resx中

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

【讨论】:

【参考方案10】:

就我而言——我在我的资源中使用了 Icons,但我需要将它们作为 Images 动态添加到一些 ToolStripMenuItem(s)。所以在我创建的方法中(这是下面的代码 sn-p 的来源),我必须先将图标资源转换为位图,然后才能将它们返回到我的MenuItem 中。

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

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

【讨论】:

【参考方案11】:

我建议:

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、...)。

【讨论】:

【参考方案12】:

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

var bmp = Resources.ImageName;

希望对你有帮助!

【讨论】:

【参考方案13】:

奇怪的是,从设计师那里我发现似乎是一种更简单的方法:

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

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

(网络 4.0,VS2010。)

【讨论】:

【参考方案14】:

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

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

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

【讨论】:

【参考方案15】:

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

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

ImagePath 是这样的:

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

【讨论】:

【参考方案16】:
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);

【讨论】:

以上是关于在 C# 中从项目的资源区域加载图像的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 C# 中从本机 C++ 类创建变量?

如何在golang中从windows`syscall`加载图像资源?

cv::VideoCapture 在 C# 项目中从 DLL 使用时不会打开文件或流

在 Swift 中从 Plist 加载 Url 图像

如何在winforms c#中从图片框中裁剪和保存非矩形但多边形区域[重复]

在 c# 中从其他资源中引用嵌入式资源