我在C#winform中有一个小应用程序。它工作得很好,但我不知道如何在代码中更改图片框的图像:
我有我的图片目录:
myProjectDirectory / bin中/照片管理/ myImage.jpg
这段代码给我一个FileNotFoundException:
this.imgInvader.Image = Image.FromFile("../Pics/invader2.jpg");
我不明白,因为我在stackoverflow上看到FromFile方法从bin / Release开始。那么../Pics/myImage.jpg应该不起作用吗?
THX
答案 0 :(得分:1)
使用图像的相对路径。
this.imgInvader.Image = Image.FromFile(@"bin\Pics\invader2.jpg");
这里给出了代码隐藏文件所在位置的路径。假设您的文件位于根目录中,并且您的图像位于bin/Pics/
文件夹中,则上述代码可以正常工作。它会自动获取与程序运行位置相关的路径。
答案 1 :(得分:1)
尝试引用可执行输出目录之外的图像文件非常脆弱。有很多方法可以出错(不幸的是,在你的问题中没有足够的背景,任何人都无法确切地知道这些方法中的哪一个是你的具体问题)。
如果必须使用磁盘上的文件来存储图像资源,则应将它们复制到 build 输出目录(即" Release")并在那里引用。将文件添加到Visual Studio项目中,选择它,然后在属性窗口中设置" Build Action"值"内容"。如果文件位于项目下的文件夹中,则它也将被复制到输出目录中的同名文件夹中。
如果你确实在磁盘上使用文件,那么确保你做的另一件事就是找到可执行文件的目录(例如通过Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
),然后将它与你预期的相对路径结合起来(例如文件名,或者在项目中为其提供的任何文件夹/子目录下的文件名,如果您使用Path.Combine()
方法,然后使用 绝对文件名作为源。否则,您的代码可能会被程序中其他位置的当前目录中的更改所迷惑(基本上,不要依赖于当前目录......这样的全局状态太容易混淆了,一旦进入使用它的习惯)。
例如:
string exeDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string imageFileName = Path.Combine(exeDirectory, "invader2.jpg");
现在,所有这些,恕我直言,将您的图像作为资源添加到可执行文件本身,然后从Properties.Resources
类引用它们可能是更好的主意。然后,图像始终与可执行文件一起使用,因为它们位于同一文件中。代码也更容易,因为您只是在Resources
类中引用了返回所需实际Image
对象的属性。
答案 2 :(得分:0)
正如前面的评论所述,不建议使用exe之外的资源,但仍可以使用Path.GetDirectoryName
方法执行此操作。
我不得不质疑为什么您的资源不在您的exe之内,为什么不将它嵌入属性中的资源> resources.resx并简单地用imgInvader.Image = Properties.Resources.FileNamehere;
调用它比信任外部环境安全得多。