如何使用GetManifestResourceStream从资源加载图片(含文件夹内图片)
从嵌入式资源加载图片(无.resx文件)
当你把图片设为Build Action = Resource且放在项目文件夹中时,核心问题是资源名称的格式——系统会把文件夹结构转换成以点.分隔的命名空间格式,而非原文件夹的斜杠/。
正确步骤与代码示例
1. 确认资源名称格式
你通过GetResourceNames拿到的testImages/add_32x32.png需要转换成程序集名.文件夹名.文件名的格式,示例中应为VisualStudioTest.testImages.add_32x32.png。
如果不确定正确名称,直接输出所有资源名来验证:
using System.Reflection; var assembly = Assembly.GetExecutingAssembly(); foreach (var name in assembly.GetManifestResourceNames()) { Console.WriteLine(name); // 复制输出的正确名称直接使用 }
2. WPF项目加载图片
两种方式可选:
- 基于程序集流加载:
using System.Reflection; using System.Windows.Media.Imaging; var assembly = Assembly.GetExecutingAssembly(); var resourceName = "VisualStudioTest.testImages.add_32x32.png"; using (var stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) throw new FileNotFoundException("指定资源未找到", resourceName); var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = stream; bitmap.CacheOption = BitmapCacheOption.OnLoad; // 防止流关闭后图片失效 bitmap.EndInit(); // 示例:赋值给WPF Image控件 // imageControl.Source = bitmap; }
- 直接用Pack URI加载(更简洁):
using System.Windows.Media.Imaging; // URI格式:pack://application:,,,/程序集名;component/文件夹路径/文件名 var bitmap = new BitmapImage(new Uri("pack://application:,,,/VisualStudioTest;component/testImages/add_32x32.png")); // imageControl.Source = bitmap;
3. WinForms项目加载图片
using System.Drawing; using System.Reflection; var assembly = Assembly.GetExecutingAssembly(); var resourceName = "VisualStudioTest.testImages.add_32x32.png"; using (var stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) throw new FileNotFoundException("指定资源未找到", resourceName); var image = Image.FromStream(stream); // 示例:赋值给WinForms PictureBox控件 // pictureBox.Image = image; }
关键注意事项
- 确保图片的
Build Action确实设置为Resource(而非Embedded Resource,两者的资源命名规则不同); - 程序集名称要和项目输出的程序集名一致(可在项目属性的"应用"标签中查看);
- 复制
GetManifestResourceNames输出的完整资源名,避免手动输入时出错。
内容的提问来源于stack exchange,提问作者PeterMacGonagan
相关产品推荐
相关产品推荐

