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


212

У мене в моєму проекті зберігається зображення Resources / myimage.jpg. Як я можу динамічно завантажувати це зображення в об'єкт Bitmap?


1
Подивіться на цю відповідь: stackoverflow.com/questions/94456/…
Роланд,

Це було питання , яке було задане питання пізніше, але пов'язано, якщо не дубльовані: stackoverflow.com/questions/13592150/load-image-from-resources
vapcguy

Відповіді:


242

Чи використовуєте Ви форми Windows? Якщо ви додали зображення за допомогою користувальницького інтерфейсу властивостей / ресурсів, ви отримуєте доступ до зображення з генерованого коду, тож ви можете просто зробити це:

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

Я намагаюся прив’язати об’єкт ресурсу до моєї datagrid, але він не відображається за допомогою вашого методу. Стовпець зображень в шаблоні даних шаблонований.
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
Вам не потрібно використовувати рефлексію - це здається надто складним з огляду на більш прості методи, доступні.
Charlie Salts

Це рішення не працює в C # / Windows Phone .NETCF --GetManifestResourceNames () повертає лише одне ім'я, модуль збірки-DLL. У маніфесті доступний лише один ресурс - блок потоку модуля DLL. Без C ++ та небезпечного коду, що дозволяє вам дзвонити на дзвінки API Win32, відверто кажучи, по-королівськи болі в дупі працювати з цим шматком пам'яті.
Марк Джонс

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;

1
Не можна отримати доступ до цього способу, якщо файл не є частиною маніфесту ресурсів, оскільки ОП чітко стверджує, що він просто додається як файл.
Воблери

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 - це будь-який тип, який ви маєте у своєму складі.


1
"Простір імен" не можна використовувати як ім'я змінної, і те, як ви отримаєте MyTypeFromSameAssemblyAsResource, буде оцінено.
Джейсон Фуерстенберг

зафіксував помилку друку, що вирішувала питання Джейсона
Джон Гібб

6

Використовуйте нижче однієї. Я перевірив це в комірці перегляду Grid форми Windows.

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

Назва "Resource_Image", яку ви можете знайти в проекті.

Під назвою проекту ви можете знайти Properties. Розгорніть. Там ви можете побачити Resources.resxфайл. Відкрий це. Застосуйте своє ім'я файлу як "Resource_Image".


5

З і ImageBox з назвою "ImagePreview FormStrings.MyImageNames містить звичайний метод передачі / встановлення рядків, який пов'язаний зі списком типів прокрутки. Зображення мають ті ж назви, що і пов'язані імена у списку, за винятком закінчень .bmp. Усі растрові зображення перетягуються в ресурси.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.


4

Ви також можете зберегти bmp у такому варіанті:

var bmp = Resources.ImageName;

сподіваюся, що це допоможе!


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

-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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.