โหลดภาพจากพื้นที่ทรัพยากรของโครงการใน C #


212

ฉันมีภาพในโครงการของฉันเก็บไว้ที่ Resources / myimage.jpg ฉันจะโหลดรูปภาพนี้ไปยังวัตถุบิตแมปได้อย่างไร


1
ดูคำตอบนี้: stackoverflow.com/questions/94456/…
Roland

นี่เป็นคำถามที่ถูกถามในภายหลัง แต่มีความเกี่ยวข้องหากไม่ซ้ำกัน: stackoverflow.com/questions/13592150/load-image-from-resources
vapcguy

คำตอบ:


242

คุณใช้ Windows Forms หรือไม่ หากคุณเพิ่มรูปภาพโดยใช้คุณสมบัติ / ทรัพยากร UI คุณจะสามารถเข้าถึงภาพจากรหัสที่สร้างขึ้นดังนั้นคุณสามารถทำได้ดังนี้:

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

ไม่มันจะถูกเพิ่มเป็นไฟล์ธรรมดาในโฟลเดอร์ Resources
Pavel Bastov

9
อาโอเค. ในกรณีนี้ฉันคิดว่า @ Hallgrim ได้รับคำตอบสำหรับคุณโดยใช้สตรีมทรัพยากร หากคุณกำลังใช้ Windows Forms ฉันอยากให้คุณลบภาพและเพิ่มมันอีกครั้งจาก UI - วิธีนั้นง่ายกว่ามาก
Matt Hamilton

114

คุณสามารถรับการอ้างอิงถึงภาพด้วยวิธีต่อไปนี้:

Image myImage = Resources.myImage;

หากคุณต้องการทำสำเนารูปภาพคุณจะต้องทำสิ่งต่อไปนี้:

Bitmap bmp = new Bitmap(Resources.myImage);

อย่าลืมทิ้งbmpเมื่อคุณทำเสร็จแล้ว หากคุณไม่ทราบชื่อของอิมเมจทรัพยากร ณ เวลารวบรวมคุณสามารถใช้ตัวจัดการทรัพยากร:

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

ประโยชน์ของ ResourceManager คือคุณสามารถใช้งานได้ตามปกติซึ่ง Resource.myImage จะอยู่นอกขอบเขตหรือที่คุณต้องการเข้าถึงทรัพยากรแบบไดนามิก นอกจากนี้ยังใช้งานได้กับเสียงไฟล์กำหนดค่า ฯลฯ


17
หมายเหตุ: ใช้ Properties.Resources.myImage;
splattne

ฉันพยายามผูกออบเจ็กต์ทรัพยากรกับดาต้ากริดของฉัน แต่ไม่ปรากฏขึ้นโดยใช้วิธีการของคุณ คอลัมน์อิมเมจ DataGrid นั้นได้รับการทำให้เป็นสี
alice7

70

คุณต้องโหลดมันจากสตรีมทรัพยากร

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

29
คุณไม่จำเป็นต้องใช้การสะท้อนสิ่งนี้ดูซับซ้อนเกินไปเนื่องจากวิธีการที่ง่ายกว่านั้น
ชาร์ลีเกลือ

วิธีนี้ไม่ทำงานใน C # / Windows Phone .NETCF --GetManifestResourceNames () จะส่งคืนชื่อเดียวเท่านั้นนั่นคือโมดูลแอสเซมบลี -DL มีเพียงทรัพยากรเดียวเท่านั้นที่มีอยู่ในรายการ - Blob กระแสของโมดูล DLL หากไม่มีรหัส C ++ และรหัสที่ไม่ปลอดภัยที่ช่วยให้คุณสามารถเรียกการเรียก Win32 API ได้มันเป็นความเจ็บปวดในการทำงานกับหน่วยความจำอันนี้
Mark Jones

2
คุณสามารถใช้งานtypeof(this).Assemblyสั้น ๆ
Sri Harsha Chilakapati

1
@SriHarshaChilakapati typeof(this)จะไม่ทำงาน this.GetType().Assemblyใกล้เคียงกับที่คุณพูดมากที่สุด แต่มีความเสี่ยงเพราะมันจะไปรับซูเปอร์คลาสที่สืบทอดมาซึ่งอาจอยู่ในชุดประกอบอื่น
John Gibb

2
@SriHarshaChilakapati typeof(this);ไม่ได้รวบรวม คุณจะได้รับError 1 Type expected
John Gibb

26

ง่ายกว่าคำตอบที่เสนอทั้งหมด

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

1
ไม่สามารถเข้าถึงด้วยวิธีนี้หากไฟล์ไม่ได้เป็นส่วนหนึ่งของรายการทรัพยากรเนื่องจาก OP ระบุอย่างชัดเจนว่าไฟล์นั้นถูกเพิ่มเป็นไฟล์
Wobbles

1
เขายังต้องการBitmapวัตถุไม่ใช่Imageวัตถุ
vapcguy

13

รหัสที่ฉันใช้ในหลายโครงการของฉัน ... มันถือว่าคุณเก็บภาพไว้ในทรัพยากรเท่านั้นเป็นบิตแมปไม่ใช่ไอคอน

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

    }

13

สิ่งที่ดีที่สุดคือการเพิ่มพวกเขาเป็นทรัพยากรรูปภาพในการตั้งค่าทรัพยากรในโครงการ จากนั้นคุณสามารถรับภาพโดยตรงโดยการทำ 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 เป็นประเภทใด ๆ ที่คุณมีในชุดประกอบ


1
"namespace" ไม่สามารถใช้เป็นชื่อตัวแปรและคุณมาถึง MyTypeFromSameAssemblyAsResource ได้อย่างไร
Jason Fuerstenberg

แก้ไขข้อผิดพลาดในการแก้ไขปัญหาของ Jason
John Gibb

6

ใช้ด้านล่างหนึ่ง ฉันได้ทดสอบสิ่งนี้กับเซลล์มุมมองกริดของ Windows ในรูปแบบ

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

ชื่อของ "Resource_Image" คุณสามารถค้นหาได้จากโครงการ

Propertiesภายใต้ชื่อโครงการที่คุณสามารถหาได้ ขยายมัน ที่นั่นคุณสามารถดูResources.resxไฟล์ เปิด. ใช้ชื่อไฟล์ของคุณเป็น "Resource_Image"


5

ด้วยและ ImageBox ชื่อ "ImagePreview FormStrings.MyImageNames มีวิธีการส่งสตริง / รับชุดปกติซึ่งเชื่อมโยงกับรายการประเภท scrollbox ภาพมีชื่อเดียวกับชื่อที่เชื่อมโยงในรายการยกเว้นตอนท้าย. bmp ทั้งหมด บิตแมปถูกลากลงใน resources.resx

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

5

ในกรณีของฉัน - ฉันใช้ไอคอนในทรัพยากรของฉัน แต่ฉันต้องการเพิ่มให้เป็นรูปภาพในบางToolStripMenuItemรายการ ดังนั้นในวิธีการที่ฉันสร้างขึ้น (ซึ่งเป็นที่ที่ข้อมูลโค้ดข้างล่างนี้มาจาก) MenuItemฉันมีการแปลงทรัพยากรที่ไอคอนเพื่อบิตแมปก่อนที่ฉันจะกลับมาพวกเขาสำหรับการนอกเหนือไปจากฉัน

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

หากรูปภาพ / ไอคอนของคุณมีช่องว่าง ("") ในชื่อเมื่อคุณเพิ่มลงในทรัพยากรของคุณ VS จะแทนที่ช่องว่างเหล่านั้นโดยอัตโนมัติด้วย "_" (s) เนื่องจากช่องว่างไม่ใช่อักขระที่ถูกต้องเมื่อตั้งชื่อทรัพยากรของคุณ นี่คือเหตุผลที่ฉันใช้Replace()วิธีการในรหัสอ้างอิงของฉัน คุณอาจเพิกเฉยต่อบรรทัดนั้นได้


5

ฉันแนะนำ:

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, ... )


5

คำตอบของ JDS ทำงานได้ดีที่สุด ตัวอย่างการโหลดรูปภาพ C #:

  • รวมภาพเป็นทรัพยากร (โครงการต้นไม้ -> ทรัพยากรคลิกขวาเพื่อเพิ่มไฟล์ที่ต้องการ ImageName.png)
  • ทรัพยากรที่ฝังตัว (ต้นไม้โครงการ -> ทรัพยากร -> ImageName.png คลิกขวาเลือกคุณสมบัติ)
  • รูปแบบไฟล์. png (.bmp .jpg ควรเป็น OK)

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

บันทึกสิ่งต่อไปนี้:

  • ไฟล์อิมเมจของทรัพยากรคือ "ImageName.png" นามสกุลไฟล์ควรถูกละเว้น
  • ชื่อโครงการอาจจะเข้าใจได้อย่างเพียงพอมากกว่าในชื่อ "แอสเซมบลีชื่อ" ซึ่งเป็นรายการข้อความที่เกี่ยวข้องในหน้าโครงการ -> คุณสมบัติ

ตัวอย่างรหัสบรรทัดทำงานได้สำเร็จโดยใช้ VisualStudio 2015 Community


4

คุณยังสามารถบันทึก bmp ในรูปแบบดังนี้:

var bmp = Resources.ImageName;

หวังว่ามันจะช่วย!


2

พอแปลกจากการเจาะนักออกแบบฉันพบว่าสิ่งที่ดูเหมือนจะเป็นวิธีที่ง่ายกว่ามาก:

ดูเหมือนว่ารูปภาพจะพร้อมใช้งานจาก. คุณสมบัติ

ฉันแค่ใช้รูปภาพเพราะทุกอย่างที่ฉันสนใจคือการวางภาพลงในส่วนควบคุมด้วยรูปภาพ

(สุทธิ 4.0, VS2010)


2

ฉันดูรหัสนักออกแบบจากหนึ่งในโครงการของฉันและสังเกตว่ามันใช้สัญลักษณ์นี้

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

โดยที่ max เป็นชื่อของทรัพยากรที่ฉันอัพโหลดไปยังโครงการ


1

หรือคุณสามารถใช้บรรทัดนี้เมื่อจัดการกับ WPF หรือ Silverlight โดยเฉพาะอย่างยิ่งที่คุณมีสตริงต้นฉบับอยู่แล้วในมาร์กอัป XAML:

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

ImagePath อยู่ตรงไหน:

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

-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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.