2009-07-28 4 views
167

У меня есть изображение в моем проекте, хранящемся в Resources/myimage.jpg. Как я могу динамически загружать это изображение в объект Bitmap?Загрузить изображение из области ресурсов проекта в C#

+1

Посмотрите на этот ответ: http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/7375570#7375570 – Roland

+0

Это был вопрос это было задано позже, но связано, если не дубликат: http://stackoverflow.com/questions/13592150/load-image-from-resources – vapcguy

ответ

198

Используете ли вы Windows Forms? Если вы добавили изображение с помощью свойств/ресурсов UI, вы получаете доступ к изображению с сгенерированного кода, так что вы можете просто сделать это:

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage); 
+0

Нет, он добавляется как простой файл в папку Ресурсы. –

+8

А, ок. В этом случае я думаю, что @ Hallgrim получил ответ для вас, используя потоки ресурсов. Если вы * используете * Windows Forms, я бы настоятельно рекомендовал вам удалить изображение и повторно добавить его из пользовательского интерфейса - гораздо проще. –

97

Вы можете получить ссылку на изображение следующим образом:

Image myImage = Resources.myImage; 

Если вы хотите сделать копию изображения, вам нужно сделать следующее:

Bitmap bmp = new Bitmap(Resources.myImage); 

не забудьте утилизировать bmp, когда вы закончите с этим. Если вы не знаете имя образа ресурса во время компиляции, вы можете использовать менеджер ресурсов:

ResourceManager rm = Resources.ResourceManager; 
Bitmap myImage = (Bitmap)rm.GetObject("myImage"); 

Преимущество ResourceManager является то, что вы можете использовать его там, где Resources.myImage обычно находиться вне объема или где вы хотите динамически получать доступ к ресурсам. Кроме того, это работает для звуков, конфигурационных файлов и т. Д.

+12

Примечание: используйте Properties.Resources.myImage; – splattne

+0

Я пытаюсь связать объект ресурса с моим datagrid, но он не отображается с помощью вашего метода. Шаблон изображения в формате datagrid является шаблонизированным. – alice7

63

Вам необходимо загрузить его из потока ресурсов.

Bitmap bmp = new Bitmap(
    System.Reflection.Assembly.GetEntryAssembly(). 
    GetManifestResourceStream("MyProject.Resources.myimage.png")); 

Если вы хотите знать все имена ресурсов в сборке, идти с:

string[] all = System.Reflection.Assembly.GetEntryAssembly(). 
    GetManifestResourceNames(); 

foreach (string one in all) { 
    MessageBox.Show(one); 
} 
+26

Вам не нужно использовать отражение - это кажется чрезмерно сложным, учитывая более простые доступные методы. –

+0

Это решение не работает на C#/Windows Phone. NETCF --GetManifestResourceNames() возвращает только одно имя - модуль сборки DLL. В манифесте есть только один ресурс - поток blob модуля DLL. Без C++ и небезопасного кода, позволяющего вызывать вызовы API Win32, откровенно королевская боль в заднице работает с этим куском памяти. –

+2

Вы также можете использовать 'typeof (this) .Assembly' для краткости. –

13

Лучше всего, чтобы добавить их в качестве изображения ресурсов в настройках ресурсов в проекте. Затем вы можете получить изображение напрямую, выполнив Resource.myimage. Это позволит получить изображение через сгенерированное свойство C#.

Если вы просто установить изображение как Внедренный ресурс вы можете получить его с:

string name = "Resources.myimage.jpg" 
string namespaceName = "MyCompany.MyNamespace"; 
string resource = namespaceName + "." + name; 
Type type = typeof(MyCompany.MyNamespace.MyTypeFromSameAssemblyAsResource); 
Bitmap image = new Bitmap(type.Assembly.GetManifestResourceStream(resource)); 

Где MyTypeFromSameAssemblyAsResource любого типа, что у вас есть в сборке.

+2

Что такое 'type'? – radbyx

+1

«namespace» не может использоваться как имя переменной и как вы попадаете в MyTypeFromSameAssemblyAsResource. –

+0

исправлено опечатка, адресованная проблеме Джейсона –

5

С и ImageBox под названием «ImagePreview FormStrings.MyImageNames содержит/набор строк метод произнесения регулярные ГЭТ, которые связаны со списком типа scrollbox. Изображения имеют те же имена, что и связанных имен в списке, за исключением . в .bmp окончаний Все растровые изображения втянута в Resources.resx достаточно

Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames); 
Bitmap myImage = (Bitmap)rm; 
ImagePreview.Image = myImage; 
2

как ни странно, из тыкать в конструкторе я считаю, что, кажется, гораздо более простой подход:

изображение, кажется, Доступно из .Properties.Resources.

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

(Net 4.0, VS2010.)

24

путь легче, чем большинство все из предложенных ответов

tslMode.Image = global::ProjectName.Properties.Resources.ImageName; 
+0

Невозможно получить доступ к этому пути, если файл не является частью манифеста ресурсов, поскольку OP четко заявляет, что он просто добавлен в файл. – Wobbles

+0

Он также хотел объект «Bitmap», а не объект «Image». – vapcguy

4

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

string imageName = myImageNameStr; 
imageName = imageName.Replace(" ", "_"); 
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName); 
return myIcon.ToBitmap(); 

Что-то еще, чтобы быть в курсе, если изображение/значок имеет пробелы (»«) в его имени, когда вы добавляете их в свой ресурс, VS автоматически заменить эти пробелы с „_“ (с). Потому что пробелы не являются допустимым символом при именовании вашего ресурса. Вот почему я использую метод Replace() в моем ссылочном коде. Вероятно, вы просто проигнорируете эту строку.

9

код я использую в некоторых из моих проектов ... Это предполагает, что вы храните изображения в ресурс только в виде растровых изображений не иконки

public static Bitmap GetImageByName(string imageName) 
    { 
     System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); 
     string resourceName = asm.GetName().Name + ".Properties.Resources"; 
     var rm = new System.Resources.ResourceManager(resourceName, asm); 
     return (Bitmap)rm.GetObject(imageName); 

    } 
+0

Это очень приятно. Спасибо :) – Derrick

3

я предлагаю:

System.Reflection.Assembly thisExe; 
thisExe = System.Reflection.Assembly.GetExecutingAssembly(); 
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg"); 
Image yourImage = Image.FromStream(file); 

Из MSDN: http://msdn.microsoft.com/en-us/library/aa287676(v=vs.71).aspx

Использование Image.FromStream лучше, потому что вам не нужно знать формат изображения (bmp, png, ...).

2

Я посмотрел на код дизайнера одного из моих проектов, и заметил, что использовал это обозначение

myButton.Image = global::MyProjectName.Properties.Resources.max; 

где Макс имя ресурса я закачанный в проект.

-1
this.toolStrip1 = new System.Windows.Forms.ToolStrip(); 
this.toolStrip1.Location = new System.Drawing.Point(0, 0); 
this.toolStrip1.Name = "toolStrip1"; 
this.toolStrip1.Size = new System.Drawing.Size(444, 25); 
this.toolStrip1.TabIndex = 0; 
this.toolStrip1.Text = "toolStrip1"; 
object O = global::WindowsFormsApplication1.Properties.Resources.ResourceManager.GetObject("best_robust_ghost"); 

ToolStripButton btn = new ToolStripButton("m1"); 
btn.DisplayStyle = ToolStripItemDisplayStyle.Image; 
btn.Image = (Image)O; 
this.toolStrip1.Items.Add(btn); 
0

Или вы могли бы использовать эту линию при работе с WPF или Silverlight, особенно там, где у вас есть строка источника уже в XAML разметке:

(ImageSource)new ImageSourceConverter().ConvertFromString(ImagePath); 

Если ImagePath что-то вроде:

string ImagePath = "/ProjectName;component/Resource/ImageName.png"; 
2

Ответ JDS работал лучше всего. C# пример загрузки изображения:

  • Включить изображение в качестве ресурса (Project tree-> Ресурсы, щелкните правой кнопкой мыши, чтобы добавить желаемый ImageName.png файл)
  • Embedded Resource (Project tree-> Resources-> ImageName.png , щелкните правой кнопкой мыши выберите свойства)
  • .png формат файла (.bmp .jpg должно быть OK)

pictureBox1.Image = ProjectName.Properties.Resources.ImageName;

Обратите внимание на следующее:

  • Файл образа ресурса - «ImageName.png», расширение файла должно быть опущено.
  • Имя проекта может быть более адекватно понято как «Имя сборки», которое должно быть соответствующим текстовым вводом на странице «Проект-> Свойства».

Пример строки кода успешно выполняется с использованием сообщества VisualStudio 2015.

2

Вы можете также сохранить в BMP вар, как это:

var bmp = Resources.ImageName; 

надеюсь, что это помогает!

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