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

问题描述 投票:0回答:17

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

c# image winforms load
17个回答
273
投票

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

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

125
投票

您可以通过以下方式获取图像的参考:

Image myImage = Properties.Resources.myImage;

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

Bitmap bmp = new Bitmap(Resources.myImage);

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

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

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


74
投票

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

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
投票

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

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

19
投票

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


14
投票

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

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

    }

14
投票

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

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

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

在项目名称下,您可以找到

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


7
投票

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

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

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

注意以下事项:

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

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


6
投票

我建议:

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


6
投票

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

var bmp = Resources.ImageName;

希望有帮助!


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;

5
投票

就我而言——我在资源中使用了Icons,但我需要将它们作为Images动态添加到某些

ToolStripMenuItem
中。因此,在我创建的方法(这是下面的代码片段的来源)中,我必须将图标资源转换为位图,然后才能将它们返回以添加到我的
MenuItem
中。

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

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

Replace()
方法。您可能可以忽略该行。


2
投票

奇怪的是,通过深入了解设计师,我发现了一种似乎更简单的方法:

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

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

(网络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";

0
投票

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

ImageList imgList = new 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()}");
            }
        }

-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);
© www.soinside.com 2019 - 2024. All rights reserved.