2015-08-23 2 views
0

У меня есть небольшое приложение в winform C#. Он отлично работает, но я не понимаю, как изменить образ коробки изображения в коде:Change pictureBox.Image with C# = FileNotFoundException

У меня есть этот каталог для моего образа:

myProjectDirectory/Bin/Pics/myImage.jpg

и этот код дает мне FileNotFoundException:

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

я не понимаю, потому что я вижу на StackOverflow, что метод FromFile начать на бен/Release. Так что ../Pics/myImage.jpg не должно работать?

Thx

ответ

1

Использовать относительный путь к изображению.

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

Здесь укажите путь от места, где находится ваш код за файлом. Предположим, что ваш файл находится в корневом каталоге, и если ваши изображения находятся в папке bin/Pics/, тогда работает приведенный выше код. Он автоматически получает путь, связанный с местом, из которого выполняется программа.

+0

привет, это не работает, у меня есть то же сообщение «FileNotFoundException». Мой проект находится на E: \ DropBox \ Dropbox \ C# \ Proejcts \ MyProjects \ bin \ Pics – barnab21

+0

Можете ли вы попробовать загрузить скриншот исключения, чтобы я мог знать, что не так. –

+0

здесь сообщение: https://www.dropbox.com/s/hujzkko91gflov8/exceptionMessage.PNG?dl=0 – barnab21

1

Попытка ссылки на файлы изображений, которые находятся за пределами исполняемого выходного каталога, невероятно хрупка. Есть много способов, по которым это может пойти не так (к сожалению, в вашем вопросе недостаточно контекста, чтобы кто-нибудь мог точно знать, какой из этих способов является вашей конкретной проблемой).

Если вы хотите использовать файлы на диске для хранения ваших ресурсов изображения, их следует скопировать в каталог вывода build (т. Е. «Release») и там, где есть ссылка. Добавьте файл в проект Visual Studio, выберите его и в окне свойств установите значение «Build Action» в «Content». Если файл находится в папке в проекте, он также будет скопирован в папку с таким же именем в выходном каталоге.

Если вы используете файлы на диске, то вам нужно найти каталог исполняемого файла (например, через Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)), а затем объединить его с вашим ожидаемым относительным путем (например, просто имя файла или имя файла в любой папке/подкаталоге, который вы дали ему в проекте, если вы это сделали), используя метод Path.Combine(), а затем используя , что абсолютное имя файла в качестве источника. В противном случае ваш код может быть смущен изменениями в текущем каталоге, созданным в другом месте вашей программы (в основном, никогда не полагайтесь на текущий каталог и hellip; глобальное состояние, подобное этому, слишком легко перепутаться, как только вы привыкнете к используй это).

Например:

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

Теперь, все, что сказал, ИМХО это, вероятно, лучше, чтобы добавить свои изображения в качестве ресурсов в самом исполняемом, а затем ссылаться на них из Properties.Resources класса. Затем изображения всегда исполняются, потому что они находятся в одном файле. Код намного проще, потому что вы просто ссылаетесь на свойства класса Resources, которые возвращают фактические Image объекты, в которых вы нуждаетесь.

0

Как указано в предыдущем комментарии, использование ресурсов за пределами вашего exe не рекомендуется, однако вы все равно можете это сделать, используя метод Path.GetDirectoryName.

На вопрос, почему ваши ресурсы основаны вне вашего exe, почему бы не вставлять его в свои ресурсы, находящиеся в свойствах> resources.resx, и просто называть его imgInvader.Image = Properties.Resources.FileNamehere;, это намного безопаснее, чем доверять внешней среде.

Смежные вопросы