Załaduj obraz z obszaru zasobów projektu w C #

Odpowiedzi:

242

Czy korzystasz z formularzy Windows? Jeśli dodałeś obraz za pomocą interfejsu użytkownika Właściwości / Zasoby, uzyskasz dostęp do obrazu z wygenerowanego kodu, dzięki czemu możesz po prostu to zrobić:

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Matt Hamilton
źródło
Nie, jest dodawany jako zwykły plik do folderu Zasoby.
Pavel Bastov
9
Ach ok. W takim przypadku myślę, że @ Hallgrim ma dla ciebie odpowiedź za pomocą strumieni zasobów. Jeśli za pomocą Windows Forms Namawiam, aby usunąć zdjęcie i ponowne dodanie go z UI - dużo łatwiej.
Matt Hamilton
114

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

Image myImage = Resources.myImage;

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

Bitmap bmp = new Bitmap(Resources.myImage);

Nie zapomnij pozbyć się bmp, gdy skończysz. Jeśli nie znasz nazwy obrazu zasobu w czasie kompilacji, możesz użyć menedżera zasobów:

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

Zaletą ResourceManager jest to, że można go używać tam, gdzie Resources.myImage normalnie byłby poza zakresem lub w celu dynamicznego dostępu do zasobów. Dodatkowo działa to w przypadku dźwięków, plików konfiguracyjnych itp.

Charlie Salts
źródło
17
Uwaga: użyj Properties.Resources.myImage;
splattne
Usiłuję powiązać obiekt zasobu z moim siatką danych, ale nie wyświetla się on za pomocą Twojej metody. Kolumna obrazu siatki danych jest szablonowana.
alice7
70

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

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

Jeśli chcesz poznać wszystkie nazwy zasobów w swoim zestawie, skorzystaj z:

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

foreach (string one in all) {
    MessageBox.Show(one);
}
Josip Medved
źródło
29
Nie powinieneś używać refleksji - wydaje się to zbyt skomplikowane, biorąc pod uwagę dostępne prostsze metody.
Charlie Salts
To rozwiązanie nie działa w C # / Windows Phone .NETCF - GetManifestResourceNames () zwraca tylko jedną nazwę modułu DLL zestawu. W manifeście dostępny jest tylko jeden zasób - obiekt blob strumienia modułu DLL. Bez C ++ i niebezpiecznego kodu pozwalającego na wywoływanie wywołań Win32 API, szczerze mówiąc, praca z tym kawałkiem pamięci jest ogromnym problemem.
Mark Jones
2
Możesz także użyć typeof(this).Assemblyw skrócie.
Sri Harsha Chilakapati
1
@SriHarshaChilakapati typeof(this)nie będzie działać. this.GetType().Assemblyjest najbliżej tego, co powiedziałeś, ale jest ryzykowne, ponieważ przejmie odziedziczoną nadklasę, która może znajdować się w innym zestawie.
John Gibb
2
@SriHarshaChilakapati typeof(this);nie kompiluje się. DostajeszError 1 Type expected
John Gibb
26

O wiele łatwiej niż większość wszystkich proponowanych odpowiedzi

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
JDS
źródło
1
Nie można uzyskać dostępu w ten sposób, jeśli plik nie jest częścią manifestu zasobów, ponieważ OP wyraźnie stwierdza, że ​​został właśnie dodany jako plik.
Wobbles,
1
Chciał także Bitmapprzedmiotu, a nie Imageprzedmiotu.
vapcguy
13

Kod, którego używam w kilku moich projektach ... Zakłada, że ​​obrazy przechowujesz w zasobach tylko jako mapy bitowe, a nie ikony

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

    }
Gary Kindel
źródło
13

Najlepiej jest dodać je jako Zasoby obrazu w ustawieniach Zasoby w projekcie. Następnie możesz uzyskać obraz bezpośrednio, wykonując Resources.myimage. Spowoduje to uzyskanie obrazu za pośrednictwem wygenerowanej właściwości C #.

Jeśli ustawisz obraz jako Zasób osadzony, możesz go uzyskać za pomocą:

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 to dowolny typ, który masz w swoim zestawie.

Hallgrim
źródło
1
„przestrzeni nazw” nie można użyć jako nazwy zmiennej. Doceniamy sposób, w jaki docieramy do MyTypeFromSameAssemblyAsResource.
Jason Fuerstenberg
naprawiono literówkę dotyczącą problemu Jasona
John Gibb
6

Użyj poniżej jednego. Przetestowałem to za pomocą komórki widoku siatki formularza Windows.

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

Nazwę „Resource_Image” można znaleźć w projekcie.

Pod nazwą projektu można znaleźć Properties. Rozwiń to. Tam możesz zobaczyć Resources.resxplik. Otwórz to. Zastosuj nazwę pliku jako „Resource_Image”.

Dzero
źródło
5

With i ImageBox o nazwie „ImagePreview FormStrings.MyImageNames zawiera zwykłą metodę rzutowania ciągów get / set, które są połączone z listą typów przewijania. Obrazy mają te same nazwy, co powiązane nazwy na liście, z wyjątkiem końcówek .bmp. Wszystkie mapy bitowe są przeciągane do pliku resources.resx

Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames);
Bitmap myImage = (Bitmap)rm;
ImagePreview.Image = myImage;
Gwałciciel
źródło
5

W moim przypadku - korzystałem z ikon w swoim zasobie, ale musiałem dynamicznie dodawać je jako obrazy do niektórych ToolStripMenuItem. Tak więc w metodzie, którą stworzyłem (z której pochodzi poniższy fragment kodu), musiałem przekonwertować zasoby ikon na bitmapy, zanim mogłem je zwrócić w celu dodania do mojego MenuItem.

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

Coś innego, o czym należy pamiętać, jeśli twój obraz / ikona ma spacje („”) w swojej nazwie, gdy dodasz je do swojego zasobu, VS automatycznie zastąpi te spacje „_” (s). Ponieważ spacje nie są prawidłowym znakiem podczas nazywania zasobu. Dlatego używam tej Replace()metody w kodzie, do którego się odwołuję. Prawdopodobnie możesz po prostu zignorować tę linię.

DSmith
źródło
5

Sugeruję:

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

Korzystanie z Image.FromStream jest lepsze, ponieważ nie musisz znać formatu obrazu (bmp, png, ...).

Davide Icardi
źródło
5

Odpowiedź JDS działała najlepiej. Przykład C # ładowanie obrazu:

  • Dołącz obraz jako Zasób (Drzewo projektu-> Zasoby, kliknij prawym przyciskiem myszy, aby dodać pożądany plik ImageName.png)
  • Osadzony zasób (Drzewo projektu-> Zasoby-> ImageName.png, kliknij prawym przyciskiem myszy wybierz właściwości)
  • Format pliku .png (.bmp .jpg również powinien być OK)

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

Zwróć uwagę na następujące:

  • Plik obrazu zasobu to „ImageName.png”, rozszerzenie pliku należy pominąć.
  • Nazwa Projektu może być może lepiej zrozumiana jako „Nazwa zestawu”, która ma być odpowiednim wpisem tekstowym na stronie Projekt-> Właściwości.

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

użytkownik3674642
źródło
4

Możesz także zapisać bmp w var:

var bmp = Resources.ImageName;

mam nadzieję, że to pomoże!

F.joksch
źródło
2

O dziwo, po wbiciu się w projektanta znajduję coś, co wydaje się być znacznie prostszym podejściem:

Obraz wydaje się być dostępny z .Properties.Resources.

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

(Net 4.0, VS2010.)

Loren Pechtel
źródło
2

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

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

gdzie max to nazwa zasobu, który przesłałem do projektu.

Andrew Stein
źródło
1

Lub możesz użyć tej linii, gdy masz do czynienia z WPF lub Silverlight, szczególnie tam, gdzie masz ciąg źródłowy już w znaczniku XAML:

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

Gdzie ImagePath jest coś takiego:

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";
TChadwick
źródło
-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
źródło