ฉันมีภาพในโครงการของฉันเก็บไว้ที่ Resources / myimage.jpg ฉันจะโหลดรูปภาพนี้ไปยังวัตถุบิตแมปได้อย่างไร
ฉันมีภาพในโครงการของฉันเก็บไว้ที่ Resources / myimage.jpg ฉันจะโหลดรูปภาพนี้ไปยังวัตถุบิตแมปได้อย่างไร
คำตอบ:
คุณใช้ Windows Forms หรือไม่ หากคุณเพิ่มรูปภาพโดยใช้คุณสมบัติ / ทรัพยากร UI คุณจะสามารถเข้าถึงภาพจากรหัสที่สร้างขึ้นดังนั้นคุณสามารถทำได้ดังนี้:
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 คือคุณสามารถใช้งานได้ตามปกติซึ่ง Resource.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
รหัสที่ฉันใช้ในหลายโครงการของฉัน ... มันถือว่าคุณเก็บภาพไว้ในทรัพยากรเท่านั้นเป็นบิตแมปไม่ใช่ไอคอน
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 มีวิธีการส่งสตริง / รับชุดปกติซึ่งเชื่อมโยงกับรายการประเภท scrollbox ภาพมีชื่อเดียวกับชื่อที่เชื่อมโยงในรายการยกเว้นตอนท้าย. 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 Community
คุณยังสามารถบันทึก bmp ในรูปแบบดังนี้:
var bmp = Resources.ImageName;
หวังว่ามันจะช่วย!
พอแปลกจากการเจาะนักออกแบบฉันพบว่าสิ่งที่ดูเหมือนจะเป็นวิธีที่ง่ายกว่ามาก:
ดูเหมือนว่ารูปภาพจะพร้อมใช้งานจาก. คุณสมบัติ
ฉันแค่ใช้รูปภาพเพราะทุกอย่างที่ฉันสนใจคือการวางภาพลงในส่วนควบคุมด้วยรูปภาพ
(สุทธิ 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);