改变图片框.图像c# = FileNotFoundException

本文关键字:FileNotFoundException 图像 改变 | 更新日期: 2023-09-27 18:09:31

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

我的图片目录如下:

myProjectDirectory/bin/图片/myImage.jpg

和这段代码给我一个FileNotFoundException:

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

我不明白,因为我在stackoverflow上看到FromFile方法开始于bin/Release。所以a ../Pics/myImage.jpg应该可以工作,不是吗?

Thx

改变图片框.图像c# = FileNotFoundException

使用图片的相对路径

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

这里给出了代码背后文件所在位置的路径。假设您的文件在根目录下,如果您的图像在bin/Pics/文件夹中,那么上面的代码可以工作。它会自动获取与程序运行位置相关的路径。

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

如果您必须使用磁盘上的文件来存储映像资源,那么应该将它们复制到build输出目录(即:"发布"),并在此处引用。将文件添加到Visual Studio项目中,选择它,在属性窗口中,将Build Action的值设置为Content。如果文件在项目下的文件夹中,那么它也将被复制到输出目录中同名的文件夹中。

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

例如:

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

现在,说了这么多,我认为在可执行文件本身中添加图像作为资源可能是一个更好的主意,然后从Properties.Resources类引用它们。然后图像总是与可执行文件在一起,因为它们在同一个文件中。代码也容易得多,因为您只需引用返回所需的实际Image对象的Resources类中的属性。

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

我要问为什么你的资源是基于你的exe之外,为什么不把它嵌入到你的资源位于属性>资源。

使用imgInvader.Image = Properties.Resources.FileNamehere;调用它比信任外部环境安全得多。
相关文章:
  • 没有找到相关文章