Загрузить изображение из области ресурсов проекта в C #

212

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

Павел Бастов
источник
1
Посмотрите на этот ответ: stackoverflow.com/questions/94456/…
Роланд
Этот вопрос был задан позже, но связан, если не с дубликатом: stackoverflow.com/questions/13592150/load-image-from-resources
vapcguy

Ответы:

242

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

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Мэтт Гамильтон
источник
Нет, он добавляется в виде простого файла в папку «Ресурсы».
Павел Бастов
9
Ах хорошо. В этом случае, я думаю, у @ Hallgrim есть ответ для вас, используя потоки ресурсов. Если вы находитесь с помощью Windows Forms Я хотел бы призвать вас , чтобы удалить изображение и повторно добавить его из пользовательского интерфейса - гораздо проще.
Мэтт Гамильтон
114

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

Image myImage = Resources.myImage;

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

Bitmap bmp = new Bitmap(Resources.myImage);

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

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

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

Чарли Солтс
источник
17
Примечание: используйте Properties.Resources.myImage;
Сплаттне
Я пытаюсь привязать объект ресурса к моей сетке данных, но он не отображается с использованием вашего метода. Столбец изображения сетки данных является шаблонным.
alice7
70

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

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);
}
Иосип Медведь
источник
29
Вам не нужно использовать рефлексию - это кажется слишком сложным, учитывая более простые доступные методы.
Чарли Солтс
Это решение не работает в C # / Windows Phone. NETCF --GetManifestResourceNames () возвращает только одно имя, имя модуля Assembly-DLL. В манифесте доступен только один ресурс - потоковый объект модуля DLL. Без C ++ и небезопасного кода, позволяющего вам вызывать вызовы Win32 API, откровенно трудно решить эту часть памяти.
Марк Джонс
2
Вы также можете использовать typeof(this).Assemblyдля краткости.
Шри Харша Чилакапати
1
@SriHarshaChilakapati typeof(this) не будет работать. this.GetType().Assemblyявляется наиболее близким к тому, что вы сказали, но это рискованно, потому что он обнаружит унаследованный суперкласс, который может находиться в другой сборке.
Джон Гибб
2
@SriHarshaChilakapati typeof(this);не компилируется. Вы получаетеError 1 Type expected
Джон Гибб
26

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

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
JDS
источник
1
Невозможно получить доступ таким способом, если файл не является частью манифеста ресурсов, так как OP ясно заявляет, что он просто добавлен как файл.
шатается
1
Он также хотел Bitmapобъект, а не Imageобъект.
vapcguy
13

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

    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);

    }
Гари Киндель
источник
13

Лучше всего добавить их в качестве ресурсов изображений в настройках ресурсов в проекте. Затем вы можете получить изображение напрямую, выполнив Resources.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 - это любой тип, который имеется в вашей сборке.

Hallgrim
источник
1
«namespace» нельзя использовать в качестве имени переменной, и то, как вы попадете в MyTypeFromSameAssemblyAsResource, будет оценено.
Джейсон Фюрстенберг
исправил опечатку, решающую проблему Джейсона
Джон Гибб
6

Используйте ниже одного. Я проверил это с помощью ячейки вида Windows.

Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;

Название «Resource_Image» вы можете узнать из проекта.

Под названием проекта вы можете найти Properties. Раскройте это. Там вы можете увидеть Resources.resxфайл. Открой это. Примените ваше имя файла как «Resource_Image».

DZERO
источник
5

С и ImageBox с именем "ImagePreview FormStrings.MyImageNames содержит обычный метод приведения строк get / set, который связан со списком типов прокрутки. Изображения имеют те же имена, что и связанные имена в списке, за исключением окончаний .bmp. Все растровые изображения перетаскиваются в resources.resx

Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames);
Bitmap myImage = (Bitmap)rm;
ImagePreview.Image = myImage;
насильник
источник
5

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

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

Что еще нужно знать, если ваше изображение / значок имеет пробелы ("") в имени, когда вы добавляете их в свой ресурс, VS автоматически заменит эти пробелы на "_" (s). Потому что пробелы не являются допустимым символом при именовании вашего ресурса. Именно поэтому я использую Replace()метод в своем ссылочном коде. Скорее всего, вы можете просто игнорировать эту строку.

митского
источник
5

Я предлагаю:

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, ...).

Давиде Икарди
источник
5

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

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

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

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

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

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

user3674642
источник
4

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

var bmp = Resources.ImageName;

Надеюсь, поможет!

F.joksch
источник
2

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

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

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

(Чистая 4.0, VS2010.)

Лорен Печтель
источник
2

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

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

где max - это имя ресурса, который я загрузил в проект.

Эндрю Стейн
источник
1

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

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

Где ImagePath что-то вроде:

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";
TChadwick
источник
-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);
IR.Programmer
источник