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

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

583555 次浏览

你使用的是Windows窗体吗?如果你已经使用属性/资源UI添加了图像,你可以从生成的代码中访问图像,所以你可以简单地这样做:

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

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

Image myImage = Resources.myImage;

如果你想为图像创建复制,你需要做以下事情:

Bitmap bmp = new Bitmap(Resources.myImage);

当你用完骨形态发生蛋白时,不要忘记释放它。如果你在编译时不知道资源映像的名称,你可以使用资源管理器:

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

ResourceManager的好处是你可以在Resources。myImage通常超出作用域,或者在您想动态访问资源的位置。此外,这适用于声音,配置文件等。

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

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

最好的方法是将它们作为图像资源添加到项目的资源设置中。然后可以通过执行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));

其中mytypefrommsameassemblyasresource是程序集中的任何类型。

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

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

奇怪的是,通过对设计师的调查,我发现了一个更简单的方法:

该映像似乎可以从. properties . resources中获得。

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

(Net 4.0, VS2010.)

比大多数提议的答案简单多了

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

在我的情况下——我在我的资源中使用图标,但我需要动态地将它们作为图片添加到一些ToolStripMenuItem(s)。因此,在我创建的方法中(下面的代码片段来自于此),我必须将图标资源转换为位图,然后才能返回它们以添加到MenuItem中。

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

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

代码我在我的几个项目中使用… 它假设你在资源中存储的图像只是位图,而不是图标

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


}

我建议:

System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file =
thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
Image yourImage = Image.FromStream(file);
从msdn < p >: http://msdn.microsoft.com/en-us/library/aa287676 (v = vs.71) . aspx < / p >

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

我查看了我的一个项目中的设计器代码,注意到它使用了这种符号

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

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

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

或者你可以在处理WPF或Silverlight时使用这一行,特别是当你已经在XAML标记中有源字符串时:

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

ImagePath是这样的:

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

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

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

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

注意以下几点:

  • 资源映像文件为“ImageName.png”,文件扩展名应省略。
  • ProjectName也许可以更充分地理解为“程序集名称”,这将是Project->属性页面上各自的文本条目。

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

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

var bmp = Resources.ImageName;

希望能有所帮助!

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

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

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

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

这是我如何从一个windows窗体应用程序的资源(.rc)文件创建一个ImageList:

ImageList imgList =新的ImageList();

        var resourceSet = DataBaseIcons.ResourceManager.GetResourceSet(CultureInfo.CreateSpecificCulture("en-EN"), true, true);


foreach (var r in resourceSet)
{
Logger.LogDebug($"Resource Type {((DictionaryEntry)r).Key.ToString()} is of {((DictionaryEntry)r).Value.GetType()}");
            

if (((DictionaryEntry)r).Value is Bitmap)
{
imgList.Images.Add(((Bitmap)(((DictionaryEntry)r).Value)));
}
else
{
Logger.LogWarning($"Resource Type {((DictionaryEntry)r).Key.ToString()} is of type {((DictionaryEntry)r).Value.GetType()}");
}
}