2009-07-28 13 views
167

Mam obraz w moim projekcie przechowywany w Resources/myimage.jpg. Jak mogę dynamicznie załadować ten obraz do obiektu Bitmap?Załaduj obraz z obszaru zasobów projektu w języku C#

+1

Spójrz na to odpowiedź: http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/7375570#7375570 – Roland

+0

To było pytanie to zostało zadane później, ale jest powiązane, jeśli nie duplikatem: http://stackoverflow.com/questions/13592150/load-image-from-resources – vapcguy

Odpowiedz

198

Czy używasz Windows Forms? Jeśli dodasz obrazu przy użyciu właściwości/Resources UI, można uzyskać dostęp do obrazu z kodem wygenerowanym, więc można po prostu to zrobić:

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

Nie, jest dodawane jako zwykły plik do folderu Zasoby. –

+8

Ah ok. W takim przypadku myślę, że @ Hallgrim ma dla ciebie odpowiedź, używając strumieni zasobów. Jeśli * używasz * Formularzy systemu Windows, zachęcam Cię do usunięcia obrazu i ponownego dodania go z interfejsu użytkownika - o wiele łatwiej. –

97

można uzyskać odwołanie do obrazu w następujący sposób:

Image myImage = Resources.myImage; 

Jeśli chcesz dokonać kopię obrazu, musisz wykonać następujące czynności:

Bitmap bmp = new Bitmap(Resources.myImage); 

nie zapomnij dysponowania o f bmp po zakończeniu pracy. Jeśli nie znasz nazwy obrazu zasobów w czasie kompilacji, można użyć menedżera zasobów:

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

Przywilej ResourceManager jest to, że można go używać gdzie Resources.myImage normalnie byłoby się zakresu lub gdzie chcesz dynamicznie uzyskiwać dostęp do zasobów. Dodatkowo działa to w przypadku dźwięków, plików konfiguracyjnych itp.

+12

Uwaga: użyj Properties.Resources.myImage; – splattne

+0

Próbuję powiązać obiekt zasobu z moim datagrid, ale nie pojawia się przy użyciu metody. Kolumna obrazu datagrid jest templatowana. – alice7

63

Musisz załadować go ze strumienia zasobów.

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

Jeśli chcesz znać nazwy wszystkich zasobów w swoim zespole, iść z:

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

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

Nie powinieneś używać odbicia - wydaje się to zbyt skomplikowane, biorąc pod uwagę prostsze dostępne metody. –

+0

To rozwiązanie nie działa w języku C#/Windows Phone. NETCF - GetManifestResourceNames() zwraca tylko jedną nazwę, nazwę modułu assembly-DLL. W manifeście dostępny jest tylko jeden zasób - strumień typu blob modułu DLL. Bez C++ i niebezpiecznego kodu, który pozwala na wywoływanie wywołań Win32 API, jest to po prostu królewski ból w tyłku do pracy z tym kawałkiem pamięci. –

+2

Możesz również użyć skrótu 'typeof (this) .Assembly'. –

13

Najlepszą rzeczą jest to, aby dodać je jako zasoby obrazu w ustawieniach zasobów w projekcie. Następnie możesz uzyskać obraz bezpośrednio, wykonując Resources.myimage. Spowoduje to pobranie obrazu za pomocą wygenerowanej właściwości języka C#.

Jeśli tylko ustawić obraz jako Embedded Resource można uzyskać go z:

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

Gdzie MyTypeFromSameAssemblyAsResource jest dowolny typ, który masz w swoim zespole.

+2

Co to jest" typ "? – radbyx

+1

"Przestrzeń nazw" nie może być używana jako nazwa zmiennej, a sposób, w jaki przybywasz do MyTypeFromSameAssemblyAsResource, byłby doceniony. –

+0

naprawiono literówkę adresującą problem Jason'a –

5

Z i Imagebox nazwie „ImagePreview FormStrings.MyImageNames zawiera regularnego pobierania/ustawiania metody rzucania strun, które są powiązane z listy typów scrollbox. ilustracje mają takie same nazwy jak powiązanych nazwisk na liście, z wyjątkiem . .BMP zakończeń Wszystkie bitmapy są przeciągane do resources.resx wystarczająco

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

dziwne, od grzebie w projektancie znajdę to, co wydaje się być znacznie prostsze podejście:

obraz wydaje się być dostępne od .Properties.Resources.

Po prostu używam obrazu, ponieważ wszystko, co mnie interesuje, to wklejenie go do elementu sterującego z obrazem na nim.

(Net 4.0, VS2010.)

24

Way łatwiej niż większość z proponowanych odpowiedzi

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

Nie można uzyskać dostępu w ten sposób, jeśli plik nie jest częścią manifestu zasobów, ponieważ PO wyraźnie stwierdza, że ​​jest on właśnie dodany jako plik. – Wobbles

+0

Chciał również obiekt 'Bitmap', a nie obiekt' Obraz'. – vapcguy

4

W moim przypadku - używałem Ikony w moim zasobem, ale musiałem dodać je dynamicznie obrazy niektórych ToolStripMenuItem (s). Tak więc w metodzie, którą utworzyłem (z której pochodzi poniższy fragment kodu), musiałem przekonwertować zasoby ikon na bitmapy, zanim mogłem je zwrócić, aby dodać je do mojego MenuItem.

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

Coś innego mieć świadomość, jeśli obraz/ikona ma spacji (”„) w jego imieniu podczas dodawania ich do zasobu, VS będzie automatycznie zastąpić te przestrzenie z «_» (s). Ponieważ spacje nie są poprawną postacią podczas nazywania zasobu. Z tego powodu używam metody Replace() w moim kodu odniesienia. Możesz po prostu zignorować tę linię.

9

Kod używam w kilku z moich projektów ... Zakłada on, że można przechowywać obrazy w zasobie nie tylko jako bitmap ikon

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

To jest bardzo ładne. Dzięki :) – Derrick

3

proponuję:

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

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

Używanie Image.FromStream jest lepsze, ponieważ nie trzeba znać formatu obrazu (bmp, png, ...).

2

patrzyłem na kod projektanta z jednego z moich projektów i zauważyłem, że użył tego zapisu

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

gdzie max jest nazwą zasobu I przesłanym do projektu.

-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

Albo można użyć tej linii w kontaktach z WPF lub Silverlight, zwłaszcza gdy masz ciąg źródłowy już znaczników XAML:

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

Jeżeli ImagePath jest coś takiego:

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

Odpowiedź JDS działała najlepiej. C# przykład loading image:

  • Dołącz obraz jako Zasobów (projekt podobnego do drzewa> Zasoby, kliknij prawym przyciskiem myszy, aby dodać pożądany plik ImageName.png)
  • osadzonego zasobu (Projekt podobnego do drzewa> Resources-> ImageName.png kliknij prawym przyciskiem wybierz polecenie właściwości)
  • .png format pliku (.bmp .jpg powinien być również OK)

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

zanotować poniższych:

  • Plik obrazu zasobu to "ImageName.png", rozszerzenie pliku należy pominąć.
  • Nazwa projektu może być może lepiej rozumiana jako "Nazwa zespołu", która ma być odpowiednią pozycją tekstową na stronie Projekt-> Właściwości.

Przykładowa linia kodu jest uruchamiana pomyślnie przy użyciu społeczności VisualStudio 2015.

2

Można również zapisać BMP w var tak:

var bmp = Resources.ImageName; 

nadzieję, że to pomaga!