У меня есть изображение в моем проекте, хранящемся в Resources / myimage.jpg. Как я могу динамически загрузить это изображение в объект Bitmap?
У меня есть изображение в моем проекте, хранящемся в Resources / myimage.jpg. Как я могу динамически загрузить это изображение в объект Bitmap?
Ответы:
Вы используете Windows Forms? Если вы добавили изображение с помощью пользовательского интерфейса «Свойства / ресурсы», вы получите доступ к изображению из сгенерированного кода, поэтому вы можете просто сделать это:
var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Вы можете получить ссылку на изображение следующим образом:
Image myImage = Resources.myImage;
Если вы хотите сделать копию изображения, вам нужно сделать следующее:
Bitmap bmp = new Bitmap(Resources.myImage);
Не забудьте утилизировать bmp, когда закончите. Если вы не знаете имя образа ресурса во время компиляции, вы можете использовать менеджер ресурсов:
ResourceManager rm = Resources.ResourceManager;
Bitmap myImage = (Bitmap)rm.GetObject("myImage");
Преимущество ResourceManager заключается в том, что вы можете использовать его там, где ресурсы Resources.myImage обычно находятся вне области видимости или где вы хотите динамически получать доступ к ресурсам. Кроме того, это работает для звуков, файлов конфигурации и т. Д.
Вам нужно загрузить его из потока ресурсов.
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);
}
typeof(this).Assembly
для краткости.
typeof(this)
не будет работать. this.GetType().Assembly
является наиболее близким к тому, что вы сказали, но это рискованно, потому что он обнаружит унаследованный суперкласс, который может находиться в другой сборке.
typeof(this);
не компилируется. Вы получаетеError 1 Type expected
Намного проще, чем большинство всех предложенных ответов
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
объект, а не Image
объект.
Код, который я использую в нескольких своих проектах ... Предполагается, что вы храните изображения в ресурсе только в виде растровых изображений, а не значков
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);
}
Лучше всего добавить их в качестве ресурсов изображений в настройках ресурсов в проекте. Затем вы можете получить изображение напрямую, выполнив 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 - это любой тип, который имеется в вашей сборке.
Используйте ниже одного. Я проверил это с помощью ячейки вида Windows.
Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;
Название «Resource_Image» вы можете узнать из проекта.
Под названием проекта вы можете найти Properties
. Раскройте это. Там вы можете увидеть Resources.resx
файл. Открой это. Примените ваше имя файла как «Resource_Image».
С и ImageBox с именем "ImagePreview FormStrings.MyImageNames содержит обычный метод приведения строк get / set, который связан со списком типов прокрутки. Изображения имеют те же имена, что и связанные имена в списке, за исключением окончаний .bmp. Все растровые изображения перетаскиваются в resources.resx
Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames);
Bitmap myImage = (Bitmap)rm;
ImagePreview.Image = myImage;
В моем случае - я использовал иконки в своем ресурсе, но мне нужно было динамически добавлять их в качестве изображений для некоторых ToolStripMenuItem
. Таким образом, в методе, который я создал (отсюда и приведенный ниже фрагмент кода), мне пришлось преобразовать ресурсы значков в растровые изображения, прежде чем я смог вернуть их для добавления к моему MenuItem
.
string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();
Что еще нужно знать, если ваше изображение / значок имеет пробелы ("") в имени, когда вы добавляете их в свой ресурс, VS автоматически заменит эти пробелы на "_" (s). Потому что пробелы не являются допустимым символом при именовании вашего ресурса. Именно поэтому я использую Replace()
метод в своем ссылочном коде. Скорее всего, вы можете просто игнорировать эту строку.
Я предлагаю:
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, ...).
Ответ JDS работал лучше всего. C # пример загрузки изображения:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Обратите внимание на следующее:
Пример строки кода успешно выполняется с помощью сообщества VisualStudio 2015.
Как ни странно, из ковыряния в конструкторе я нахожу гораздо более простой подход:
Изображение, кажется, доступно из .Properties.Resources.
Я просто использую изображение, так как все, что меня интересует, это вставить его в элемент управления с изображением на нем.
(Чистая 4.0, VS2010.)
Я посмотрел на код конструктора из одного из моих проектов и заметил, что он использует эту запись
myButton.Image = global::MyProjectName.Properties.Resources.max;
где max - это имя ресурса, который я загрузил в проект.
Или вы можете использовать эту строку при работе с WPF или Silverlight, особенно если у вас уже есть исходная строка в разметке XAML:
(ImageSource)new ImageSourceConverter().ConvertFromString(ImagePath);
Где ImagePath что-то вроде:
string ImagePath = "/ProjectName;component/Resource/ImageName.png";
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);