将 pictureBox.Image 更改为 c# = FileNotFoundException

Change pictureBox.Image with c# = FileNotFoundException

我在 C# winform 中有一个小应用程序。它工作得很好,但我不明白如何在代码中更改图片框的图像:

我的图片有这个目录:

myProjectDirectory/bin/Pics/myImage.jpg

这段代码给我一个 FileNotFoundException :

this.imgInvader.Image = Image.FromFile("../Pics/invader2.jpg");

我不明白,因为我在 Whosebug 上看到 FromFile 方法从 bin/Release 开始。所以 ../Pics/myImage.jpg 应该行不?

感谢

使用图片的相对路径。

this.imgInvader.Image = Image.FromFile(@"bin\Pics\invader2.jpg");

此处给出代码隐藏文件所在位置的路径。假设如果您的文件位于根目录中,并且您的图像位于 bin/Pics/ 文件夹中,则上述代码有效。它会自动获取与程序 运行 来自的位置相关的路径。

尝试引用可执行输出目录之外的图像文件非常脆弱。有很多方法可能出错(不幸的是,您的问题中没有足够的上下文让任何人确切地知道这些方法中的哪一种是您的具体问题)。

如果您必须使用磁盘上的文件来存储图像资源,则应将它们复制到 build 输出目录(即 "Release")并在那里引用。将文件添加到您的 Visual Studio 项目,select 它,然后在属性 window 中,将 "Build Action" 值设置为 "Content"。如果文件在项目下的文件夹中,那么它也会被复制到输出目录中的同名文件夹中。

如果你确实使用磁盘上的文件,另一件要确保你做的事情是找到可执行文件的目录(例如通过 Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)),然后将它与你期望的相对路径(例如只是文件名,或者你在项目中给它的任何 folder/subdirectory 下的文件名,如果你这样做的话)使用 Path.Combine() 方法,然后使用 that 绝对文件名作为来源。否则,您的代码可能会被程序中其他地方对当前目录所做的更改所混淆(基本上,永远不要依赖当前目录……一旦您养成这样的全局状态就太容易混淆了使用它)。

例如:

string exeDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string imageFileName = Path.Combine(exeDirectory, "invader2.jpg");

现在,综上所述,恕我直言,将图像作为资源添加到可执行文件本身中,然后从 Properties.Resources class 中引用它们可能是一个更好的主意。然后图像总是与可执行文件一起,因为它们在同一个文件中。代码也容易得多,因为您只是引用 Resources class 中的属性,即 return 您需要的实际 Image 对象。

正如前面的评论所述,不建议使用 exe 之外的资源,但是您仍然可以使用 Path.GetDirectoryName 方法来做到这一点。

我想问为什么你的资源是基于你的 exe 之外的,为什么不将它嵌入到位于属性> resources.resx 中的资源中并简单地用 imgInvader.Image = Properties.Resources.FileNamehere; 调用它很多比相信外部环境更安全。