在C#中从相对路径加载picturebox图片文件

5
我在Windows Form解决方案中有一个PictureBox图像。用户从数据库中选择项目后,我想将一张图片加载到这个PictureBox中。图片的文件名将来自数据库,所有图片都必须存储在应用程序文件夹的子文件夹(\Images)中。 我不想在我的解决方案中包含所有这些(2000-3000张)图片,此外,随着数据库的增长,用户还会添加更多的图片。 另外,我不想编写绝对路径。所以这不是我想要的:
pictureBox.Image = Image.FromFile(@"C:\Program Files\Application\Images\" + dbase.filename);

我想编写一个相对路径,使得无论应用程序安装在哪里,都可以从特定的子文件夹加载图片。

我尝试了以下代码,使用临时测试图片 "test.jpg":

pictureBox.Image = Image.FromFile(@"Images\test.jpg");
pictureBox.Image = Image.FromFile(@"..\Images\test.jpg");
pictureBox.Image = Image.FromFile(@"|DataDirectory|\Images\test.jpg");

但是这些方法都不起作用。我只能使用绝对路径才能让它工作,例如"C:\Images\test.jpg"。我该怎么办?


问题在于当前目录不是您所期望的。加入 MsgBox(Environment.CurrentDirectory) 来查看它实际上是什么。 - Ross Presser
感谢您指出这一点,Ross。看起来当前目录是..\bin\Debug。当我将我的Images文件夹放入其中并使用pictureBox.Load(“./ Images / test.jpg”)运行代码时,它可以正常工作。但是,当我发布我的项目并安装它时,无论我在应用程序文件夹中放置Images文件夹在哪里,它都找不到。然后,当前目录指向C:\ Users \ AppData \ Local \ Apps \等的某个抽象子文件夹。 - Ivo77
3个回答

4

您尝试过PictureBox.Load方法吗?

如果url参数指示本地文件,则建议使用本地文件路径格式。例如,位于c:\的名为myPicture.jpg的图像文件可以通过将c:\myPicture.jpg传递给url参数来访问。全路径,例如http://www.contoso.com/path/images/image.jpg或相对路径,例如./images/image.jpg,都可以使用。如果使用相对路径,则将被视为相对于工作目录。调用Load方法会将ImageLocation属性设置为url的值。


谢谢Maverick。PictureBox.Load的建议对我在项目中的开端非常有帮助。我成功地使用[pictureBox.Load("./Images/test.jpg")]检索了图像。然而,当我将应用程序发布并安装到类似C:\ Test的文件夹中时,它无法再找到Images文件夹。我已经将其复制到C:\ Test \ Images和每个子文件夹中,但没有成功。 - Ivo77
实际上这不在我的项目中。我的最终应用程序将使用位于“Images”文件夹中的2000到3000张图片集合。当用户通过选择图像(将被调整大小并保存到“Images”文件夹)向数据库添加新项时,图像数量将增加。因此,我不能将图像作为项目的一部分,只能将其作为保留给它们的子文件夹。 - Ivo77
1
@Ivo77 - 可以的。你基本上需要做@raney的回答所说的,但是你需要将其设置为当前目录,而不是分配给变量。因此,它将是Environment.CurrentDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Images");Environment.CurrentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);取决于你想要走哪条路。 - Code Maverick
我已经按照你的建议做了,但仍然没有成功。我添加了一个消息框来显示 Environment.CurrentDir 的路径。在我的VS2012项目中,它显示为:“D:\Projectfolder\Testproject\bin\Debug”。当我将其发布到C:\test并运行setup.exe以便将应用程序安装在C:\test中时,消息框显示CurrentDir是“C:\Users\myname\AppData\Local\Apps\2.0\JL02K8RB.63M\3RDXJ017.QEO...”和其他一些无关紧要的内容。我希望在将应用程序发布和设置到C:\test之后,CurrentDir仅指向C:\test或C:\test\Application Files。 - Ivo77
1
啊,找到了!好的,Maverick。再一次,你是最棒的! - Ivo77
显示剩余22条评论

1
我会使用反射来获取执行目录,例如:
string ImagesDirectory = 
    Path.Combine(
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
        "Images"
    );

谢谢Raney。您的建议在我使用它在我的VS2012项目时完美地运行。但是如我在上面的评论中提到的,当我发布和安装应用程序时,我会遇到困难。它无法在已安装应用程序的文件夹内找到\Images子文件夹。 - Ivo77

0

将图像加载到picturbox的最佳方法是,从项目资源文件夹中加载所需的图像。

请执行以下操作:

  1. 将所需的图像添加到资源文件夹。
  2. 从资源文件夹加载图像到picturebox中。

    Form1.pictureBox1.Image = yourProject.Properties.Resources.YourImage;

注意:不需要指定图像类型[.bmp、.jpg等]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接