Mam obraz w moim projekcie przechowywany w Resources / myimage.jpg. Jak mogę dynamicznie załadować ten obraz do obiektu Bitmap?
Mam obraz w moim projekcie przechowywany w Resources / myimage.jpg. Jak mogę dynamicznie załadować ten obraz do obiektu Bitmap?
Odpowiedzi:
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);
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.
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);
}
typeof(this).Assembly
w skrócie.
typeof(this)
nie będzie działać. this.GetType().Assembly
jest najbliżej tego, co powiedziałeś, ale jest ryzykowne, ponieważ przejmie odziedziczoną nadklasę, która może znajdować się w innym zestawie.
typeof(this);
nie kompiluje się. DostajeszError 1 Type expected
O wiele łatwiej niż większość wszystkich proponowanych odpowiedzi
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
przedmiotu, a nie Image
przedmiotu.
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);
}
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.
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.resx
plik. Otwórz to. Zastosuj nazwę pliku jako „Resource_Image”.
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;
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ę.
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, ...).
Odpowiedź JDS działała najlepiej. Przykład C # ładowanie obrazu:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Zwróć uwagę na następujące:
Przykładowa linia kodu jest pomyślnie uruchamiana przy użyciu VisualStudio 2015 Community.
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.)
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.
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";
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);