2015-12-14 3 views
1

Я пытаюсь загрузить кучу изображений из моего файла ресурсов, но по какой-то причине я получаю FileNotFoundException. Имена изображений выглядят так: «image01.png», «image02.png», ..., «image10.png», image11.png «C#: FileNotFoundException при загрузке изображений из ресурса

В конце я хочу иметь возможность отображать все изображения на экране

Вот что у меня есть:.

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) 

Скриншот: updated code

Я также установил тип на линии 56 из: «PictureForm.PuzzleForm.» На «PicturePuzzle.», Но все равно не повезло.

+0

Каков ваш «файл ресурсов», где он хранится, и где ваш код выполняется из-за этого файла ресурсов? –

+2

Встроенные файлы ресурсов встроены в сборку вывода. Где, по вашему мнению, в этом коде вы говорите компьютеру искать файлы в сборке? Кажется, вы пытаетесь загрузить их из файловой системы. – adv12

+0

@ adv12: На самом деле не похоже, что он пытается загрузить встроенный ресурс, а загружает файлы .png с диска. –

ответ

3

Вы не указали путь загрузки файла. Они будут загружены с места сборки.

Обратите внимание, что Image.FromFile не загружает встроенный ресурс, а скорее .png с диска. Я предполагаю, что это то, что вы намерены.

Проверьте свойства изображений в Visual Studio и убедитесь, что Copy to Output Directory копирует, если Newer или Copy Always. Вот скриншот (в моем случае это ресурс курсора, но та же идея для изображения).

enter image description here

UPDATE

Если вы встроили изображения в вашем 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)

ПРИМЕЧАНИЕ

Вы можете вставлять свои изображения в двоичный файл (обычно ваш .exe), установив свойство Build Action в Embedded Resource или оставьте их в виде отдельных файлов, установив Build Action to Content. Если вы оставите контент, установите для параметра Копировать в выходной каталог значение Истина.

+0

Игнорировать мой предыдущий комментарий - я могу видеть из вашего комментария на OP, что вы интерпретируете его сообщение, чтобы предположить, что он хочет * файлы локально. Извиняюсь. –

+0

@BrianWarshaw: Я обновил свой ответ на счет обеих возможностей. –

+0

Спасибо, я пробовал это сделать, но я получаю сообщение об ошибке для этой последней строки. Ошибка: «... не содержит определения для« picturebox1 »и не существует метода расширения для« picturebox1 », принимающего первый тип аргумента MyProject.MyClass», можно найти « –

0

В вашем коде ничего не сказано о том, где находятся файлы, поэтому он по умолчанию не имеет файлов. Если файлы находятся в том же месте, что и ваш exe, попробуйте что-то вроде imgNmae = "./image0" + i + ".png";

корректировка относительного пути для учета того, где фактически находятся файлы.

+0

почему нисходящий? он ответил на заданный вопрос ... –

+0

Если его файлы находятся в том же месте, что и его .exe, тогда нет необходимости добавлять часть пути ./ 'пути. Он уже смотрит туда. –