【问题标题】:C#: FileNotFoundException when loading images from resourceC#:从资源加载图像时出现 FileNotFoundException
【发布时间】:2015-12-14 20:22:37
【问题描述】:

我试图从我的资源文件中加载一堆图像,但由于某种原因我得到了 FileNotFoundException。图像名称如下: "image01.png", "image02.png", ... , "image10.png", image11.png"

最后我希望能够在屏幕上显示所有图像。

这是我所拥有的:

  String imgName;
        int row = 0, col = 0;

        for (int i = 1; i <= 15; i++)
        {
            //get the name of the current image
            if (i < 10)
                imgName = "image0" + i + ".png";
            else
                imgName = "image" + i + ".png";

            Image img = null;
            try { 
                img = Image.FromFile(imgName);//read the image from the resource file
            }
                catch (Exception e) { Console.WriteLine("ERROR!!!" + e); }
}

这是我得到的示例错误输出:

ERROR!!!System.IO.FileNotFoundException: tile01.png
   at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
   at System.Drawing.Image.FromFile(String filename)

截图:

我还在第 56 行从“PictureForm.PuzzleForm”中修复了一个类型。到“图片拼图”。但仍然没有运气。

【问题讨论】:

  • 你的“资源文件”是什么,它存储在哪里,你的代码在哪里执行?
  • 嵌入的资源文件被内置到输出程序集中。您认为您在这段代码中的什么位置告诉计算机在程序集中查找文件?您似乎正在尝试从文件系统加载它们。
  • @adv12:看起来他并不是在尝试加载嵌入式资源,而是从磁盘加载 .png 文件。
  • 我的资源文件是我的项目文件中的一个文件。路径是这样的:C:\Users\me\blah\Project\MyImageProject\Resources
  • 是不是和java很像,你的项目可以有一个res文件夹,你可以把你的图片放进去,然后从那里读取?

标签: c# image resources filenotfoundexception


【解决方案1】:

您没有指定加载文件的路径。它们将从程序集运行的位置加载。

请注意,Image.FromFile 不会加载嵌入式资源,而是从磁盘加载 .png。我想这就是你想要的。

在 Visual Studio 中检查图像的属性并确保复制到输出目录为“如果较新则复制”或“始终复制”。这是一个屏幕截图(在我的例子中,它是一个光标资源,但图像的想法相同)。

更新

如果您已将图像嵌入到 EXE 或其他文件中,则可以使用类似于

的代码
System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
this.pictureBox1.Image = Image.FromStream(file);

(Source)

注意

您可以通过将 Build Action 属性设置为 Embedded Resource 将图像嵌入二进制文件(通常是您的 .exe)中,或者通过将 Build Action 设置为 Content 将它们保留为单独的文件。如果您作为内容离开,请将复制到输出目录设置为 True。

【讨论】:

  • 忽略我之前的评论——我可以从您对 OP 的评论中看出您正在解释他的帖子以暗示他想要本地文件。道歉。
  • @BrianWarshaw:我更新了我的答案以考虑这两种可能性。
  • 谢谢,我试过这样做,但最后一行出现错误。错误是:“...不包含 'picturebox1' 的定义,并且找不到接受第一个参数类型 MyProject.MyClass' 的 'picturebox1' 的扩展方法”
  • 可能是因为我的倒数第二行是这样的:System.IO.Stream file = thisExe.GetManifestResourceStream("AssemblyName." + imgName);
  • 您需要输入程序集的实际名称(例如 MyProject)和图像文件的实际名称。 “AssemblyName”是程序名称的占位符。
【解决方案2】:

您的代码中没有说明文件所在的位置,因此它默认位于文件所在的位置。如果文件与您的 exe 位于同一位置,请尝试类似 imgNmae = "./image0" + i + ".png";

调整相对路径以考虑文件的实际位置。

【讨论】:

  • 如果他的文件和他的.exe在同一个位置,那么就不需要添加路径的./部分。它已经在那儿了。
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多