프로젝트에 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의 장점은 Resources.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 # 속성을 통해 이미지를 가져옵니다.
이미지를 Embedded Resource로 설정하면 다음과 같이 얻을 수 있습니다.
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"로 적용하십시오.
"ImagePreview FormStrings.MyImageNames"라는 이름의 ImageBox에는 스크롤 상자 유형 목록에 연결된 일반 get / set 문자열 캐스트 메서드가 포함되어 있습니다. 이미지의 이름은 .bmp 엔딩을 제외하고 목록의 연결된 이름과 동일합니다. 비트 맵이 리소스로 드래그됩니다.
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가 자동으로 해당 공백을 "_"(들)로 바꿉니다. 자원의 이름을 지정할 때 공백은 유효한 문자가 아니기 때문입니다. 그래서 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
이미지 형식 (bmp, png, ...)을 알 필요가 없으므로 Image.FromStream을 사용하는 것이 좋습니다.
JDS의 답변이 가장 효과적이었습니다. C # 예제 로딩 이미지 :
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
다음 사항에 유의하십시오.
예제 코드 줄은 VisualStudio 2015 Community를 사용하여 성공적으로 실행됩니다.
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);