Tải hình ảnh từ khu vực tài nguyên của dự án trong C #


212

Tôi có một hình ảnh trong dự án của tôi được lưu trữ tại Resources / myimage.jpg. Làm cách nào tôi có thể tự động tải hình ảnh này vào đối tượng Bitmap?


1
Nhìn vào câu trả lời này: stackoverflow.com/questions/94456/ Kẻ
Roland

Đây là một câu hỏi đã được sau đó, nhưng có liên quan, nếu không phải là một trùng lặp: stackoverflow.com/questions/13592150/load-image-from-resources
vapcguy

Câu trả lời:


242

Bạn đang sử dụng Windows Forms? Nếu bạn đã thêm hình ảnh bằng UI Thuộc tính / Tài nguyên, bạn có quyền truy cập vào hình ảnh từ mã được tạo, vì vậy bạn chỉ cần làm điều này:

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

Không, nó được thêm dưới dạng một tệp đơn giản vào thư mục Tài nguyên.
Pavel Bastov

9
À được rồi Trong trường hợp đó, tôi nghĩ rằng @ Hallgrim đã có câu trả lời cho bạn khi sử dụng các luồng tài nguyên. Nếu bạn đang sử dụng Windows Forms, tôi khuyên bạn nên xóa hình ảnh và thêm lại nó từ UI - cách đó dễ dàng hơn nhiều.
Matt Hamilton

114

Bạn có thể có được một tham chiếu đến hình ảnh theo cách sau:

Image myImage = Resources.myImage;

Nếu bạn muốn tạo một bản sao của hình ảnh, bạn cần thực hiện như sau:

Bitmap bmp = new Bitmap(Resources.myImage);

Đừng quên vứt bỏ bmp khi bạn hoàn thành nó. Nếu bạn không biết tên của hình ảnh tài nguyên tại thời gian biên dịch, bạn có thể sử dụng trình quản lý tài nguyên:

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

Lợi ích của ResourceManager là bạn có thể sử dụng nó trong đó Resource.myImage thường nằm ngoài phạm vi hoặc nơi bạn muốn truy cập động các tài nguyên. Ngoài ra, điều này hoạt động cho âm thanh, tập tin cấu hình, vv


17
Lưu ý: sử dụng Properties.Resource.myImage;
splattne

Tôi đang cố gắng liên kết đối tượng tài nguyên với datagrid của mình nhưng nó không hiển thị bằng phương thức của bạn. Cột hình ảnh datagrid được templatized.
alice7

70

Bạn cần tải nó từ luồng tài nguyên.

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

Nếu bạn muốn biết tất cả các tên tài nguyên trong hội đồng của bạn, hãy đi với:

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

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

29
Bạn không cần phải sử dụng sự phản chiếu - điều này dường như quá phức tạp với các phương pháp đơn giản hơn có sẵn.
Charlie Salts

Giải pháp này không hoạt động trong C # / Windows Phone .NETCF --GetManifestResourceNames () chỉ trả về một tên duy nhất, đó là mô-đun lắp ráp-DLL. Chỉ có một tài nguyên có sẵn trong tệp kê khai - blob stream của mô-đun DLL. Không có C ++ và mã không an toàn cho phép bạn gọi các cuộc gọi API Win32, thực sự là một nỗi đau của hoàng gia khi làm việc với khối bộ nhớ này.
Mark Jones

2
Bạn cũng có thể sử dụng typeof(this).Assemblycho ngắn.
Sri Harsha Chilakapati

1
@SriHarshaChilakapati typeof(this)sẽ không hoạt động. this.GetType().Assemblylà gần nhất với những gì bạn nói, nhưng nó có rủi ro vì nó sẽ chọn một siêu lớp kế thừa có thể nằm trong một tổ hợp khác.
John Gibb

2
@SriHarshaChilakapati typeof(this);không biên dịch. Bạn nhận đượcError 1 Type expected
John Gibb

26

Cách dễ dàng hơn hầu hết tất cả các câu trả lời được đề xuất

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

1
Không thể truy cập theo cách đó nếu tệp không phải là một phần của tài nguyên biểu hiện vì OP nói rõ rằng nó chỉ được thêm dưới dạng tệp.
Lúng túng

1
Ông cũng muốn một Bitmapđối tượng, không phải một Imageđối tượng.
vapcguy

13

Mã tôi sử dụng trong một số dự án của mình ... Giả sử rằng bạn chỉ lưu trữ hình ảnh trong tài nguyên dưới dạng bitmap không phải là biểu tượng

    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

Điều tốt nhất là thêm chúng dưới dạng Tài nguyên hình ảnh trong cài đặt Tài nguyên trong Dự án. Sau đó, bạn có thể lấy hình ảnh trực tiếp bằng cách thực hiện Resources.myimage. Điều này sẽ nhận được hình ảnh thông qua một thuộc tính C # được tạo.

Nếu bạn chỉ đặt hình ảnh là Tài nguyên được nhúng, bạn có thể lấy nó bằng:

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

Trong đó MyTypeFromSameAss lanhAsResource là bất kỳ loại nào bạn có trong hội đồng của mình.


1
"không gian tên" không thể được sử dụng làm tên biến và cách bạn đến MyTypeFromSameAss lanhAsResource sẽ được đánh giá cao.
Jason Fuerstenberg

đã sửa lỗi chính tả cho vấn đề của Jason
John Gibb

6

Sử dụng dưới đây một. Tôi đã thử nghiệm điều này với ô xem dạng lưới của Windows.

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

Tên của "Resource_Image", bạn có thể tìm thấy từ dự án.

Dưới tên của dự án, bạn có thể tìm thấy Properties. Mở rộng nó. Ở đó bạn có thể xem Resources.resxtập tin. Mở nó ra. Áp dụng tên tệp của bạn là "Resource_Image".


5

Với và ImageBox có tên "ImagePreview FormStrings.MyImageNames chứa một phương thức truyền chuỗi get / set thông thường, được liên kết với danh sách loại hộp cuộn. Các hình ảnh có cùng tên với các tên được liên kết trong danh sách, ngoại trừ các kết thúc .bmp. bitmap được kéo vào tài nguyên.resx

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

5

Trong trường hợp của tôi - Tôi đã sử dụng Biểu tượng trong tài nguyên của mình, nhưng tôi cần thêm chúng một cách linh hoạt dưới dạng Hình ảnh vào một số ToolStripMenuItem(s). Vì vậy, trong phương thức mà tôi đã tạo (đó là đoạn mã bên dưới xuất phát), tôi đã phải chuyển đổi tài nguyên biểu tượng thành bitmap trước khi tôi có thể trả lại chúng để thêm vào MenuItem.

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

Một điều khác cần chú ý, nếu hình ảnh / biểu tượng của bạn có khoảng trắng ("") trong tên của nó khi bạn thêm chúng vào tài nguyên của mình, VS sẽ tự động thay thế các khoảng trắng đó bằng "_" (s). Bởi vì, khoảng trắng không phải là ký tự hợp lệ khi đặt tên tài nguyên của bạn. Đó là lý do tại sao tôi đang sử dụng Replace()phương thức trong mã tham chiếu của mình. Bạn có thể chỉ cần bỏ qua dòng đó.


5

Tôi đề nghị:

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

Từ msd: http://msdn.microsoft.com/en-us/l .aspx

Sử dụng Image.FromStream sẽ tốt hơn vì bạn không cần biết định dạng của hình ảnh (bmp, png, ...).


5

Câu trả lời của JDS hoạt động tốt nhất. Ví dụ tải hình ảnh C #:

  • Bao gồm hình ảnh dưới dạng Tài nguyên (Cây dự án-> Tài nguyên, nhấp chuột phải để thêm tệp mong muốn ImageName.png)
  • Tài nguyên nhúng (Cây dự án-> Tài nguyên-> ImageName.png, nhấp chuột phải vào chọn thuộc tính)
  • Định dạng tệp .png (.bmp .jpg cũng sẽ ổn)

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

Lưu ý những điều sau:

  • Tệp hình ảnh tài nguyên là "ImageName.png", phần mở rộng tệp nên được bỏ qua.
  • ProjectName có lẽ có thể được hiểu đầy đủ hơn là "Tên hội", là mục nhập văn bản tương ứng trên trang Project-> Properties.

Dòng mã ví dụ được chạy thành công khi sử dụng Cộng đồng VisualStudio 2015.


4

Bạn cũng có thể lưu bmp trong một var như thế này:

var bmp = Resources.ImageName;

hy vọng nó giúp!


2

Thật kỳ lạ, từ việc chọc vào nhà thiết kế tôi thấy điều có vẻ là một cách tiếp cận đơn giản hơn nhiều:

Hình ảnh dường như có sẵn từ .Properies.Resource.

Tôi chỉ đơn giản là sử dụng một hình ảnh vì tất cả những gì tôi quan tâm là dán nó vào một điều khiển với một hình ảnh trên đó.

(Mạng 4.0, VS2010.)


2

Tôi đã xem mã thiết kế từ một trong các dự án của tôi và nhận thấy nó sử dụng ký hiệu này

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

trong đó max là tên của tài nguyên tôi đã tải lên vào dự án.


1

Hoặc bạn có thể sử dụng dòng này khi giao dịch với WPF hoặc Silverlight, đặc biệt là nơi bạn đã có chuỗi nguồn đã có trong đánh dấu XAML:

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

Trong đó ImagePath là một cái gì đó như:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.