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?
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?
Câu trả lời:
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);
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
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);
}
typeof(this).Assembly
cho ngắn.
typeof(this)
sẽ không hoạt động. this.GetType().Assembly
là 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.
typeof(this);
không biên dịch. Bạn nhận đượcError 1 Type expected
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;
Bitmap
đối tượng, không phải một Image
đối tượng.
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);
}
Đ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.
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.resx
tập tin. Mở nó ra. Áp dụng tên tệp của bạn là "Resource_Image".
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;
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 đó.
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, ...).
Câu trả lời của JDS hoạt động tốt nhất. Ví dụ tải hình ảnh C #:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Lưu ý những điều sau:
Dòng mã ví dụ được chạy thành công khi sử dụng Cộng đồng VisualStudio 2015.
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.)
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.
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";
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);