我的项目中有一个图像,存储在Resources / myimage.jpg中。如何动态地将此图像加载到Bitmap对象中?
我的项目中有一个图像,存储在Resources / myimage.jpg中。如何动态地将此图像加载到Bitmap对象中?
Answers:
您可以通过以下方式获得对图像的引用:
Image myImage = Resources.myImage;
如果要复制图像,则需要执行以下操作:
Bitmap bmp = new Bitmap(Resources.myImage);
完成bmp时,不要忘记处理它。如果在编译时不知道资源映像的名称,则可以使用资源管理器:
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);
}
typeof(this).Assembly
简称。
typeof(this)
无法正常工作。this.GetType().Assembly
是最接近您说的内容,但是这样做有风险,因为它会继承继承的超类,而继承的超类可能在不同的程序集中。
typeof(this);
无法编译。您会收到Error 1 Type expected
我在几个项目中使用的代码...假定您仅将图像作为位图而不是图标存储在资源中
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);
}
最好的办法是在“项目”的“资源”设置中将它们添加为“图像资源”。然后,您可以通过执行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是程序集中具有的任何类型。
就我而言-我在资源中使用了图标,但是我需要将它们作为图像动态添加到某些图像中ToolStripMenuItem
。因此,在我创建的方法(下面的代码片段来自此方法)中,必须将图标资源转换为位图,然后才能将其返回以添加到我的MenuItem
。
string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();
还有一点需要注意的是,如果将图像/图标添加到资源中时,其名称中带有空格(“”),则VS会自动将这些空格替换为“ _”。因为,命名资源时,空格不是有效字符。这就是为什么我Replace()
在引用的代码中使用该方法的原因。您可能会忽略该行。
我建议:
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/zh-cn/library/aa287676( v=vs.71) .aspx
使用Image.FromStream更好,因为您不需要知道图像的格式(bmp,png,...)。
JDS的答案效果最好。C#示例加载图像:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
请注意以下几点:
使用Visual Studio 2015社区成功运行了示例代码行。
奇怪的是,从找设计师开始,我发现似乎更简单的方法是:
该图像似乎可以从.Properties.Resources获得。
我只是使用图像,因为我感兴趣的只是将其粘贴到带有图像的控件中。
(Net 4.0,VS2010。)
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);