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이 리소스 스트림을 사용하는 것에 대한 답변을 얻었습니다. 당신이 경우 입니다 윈도우 폼을 사용하여 나는 이미지를 삭제하도록 촉구하고 UI에서 그것을 재 - 추가 - 방법이 훨씬 쉽다.
매트 해밀턴

114

다음과 같은 방법으로 이미지에 대한 참조를 얻을 수 있습니다.

Image myImage = Resources.myImage;

당신이 확인하려면 사본 이미지를, 당신은 다음을 수행해야합니다 :

Bitmap bmp = new Bitmap(Resources.myImage);

완료되면 bmp 를 폐기하는 것을 잊지 마십시오 . 컴파일 타임에 리소스 이미지의 이름을 모르는 경우 리소스 관리자를 사용할 수 있습니다.

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

ResourceManager의 장점은 Resources.myImage가 일반적으로 범위를 벗어나거나 자원에 동적으로 액세스하려는 경우 사용할 수 있다는 것입니다. 또한 이것은 사운드, 구성 파일 등에서 작동합니다.


17
참고 : Properties.Resources.myImage를 사용하십시오.
splattne

리소스 개체를 내 데이터 그리드에 바인딩하려고하지만 메서드를 사용하여 표시되지 않습니다. 데이터 그리드 이미지 열이 템플릿 화됩니다.
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
리플렉션을 사용할 필요는 없습니다. 사용 가능한 간단한 방법을 고려할 때 지나치게 복잡해 보입니다.
Charlie Salts

이 솔루션은 C # / Windows Phone에서 작동하지 않습니다. .NETCF --GetManifestResourceNames ()는 assembly-DLL 모듈의 단일 이름 만 반환합니다. 매니페스트에는 DLL 모듈의 스트림 블롭 인 리소스가 하나만 있습니다. C ++과 안전하지 않은 코드를 사용하지 않으면 Win32 API 호출을 호출 할 수 있기 때문에이 메모리 덩어리로 작업하는 것은 엄청난 고통입니다.
Mark Jones

2
typeof(this).Assembly짧게 사용할 수도 있습니다 .
스리 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 # 속성을 통해 이미지를 가져옵니다.

이미지를 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는 어셈블리에있는 모든 유형입니다.


1
"네임 스페이스"는 변수 이름으로 사용할 수 없으며 MyTypeFromSameAssemblyAsResource에 도착하는 방법에 감사하겠습니다.
Jason Fuerstenberg 4

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

"ImagePreview FormStrings.MyImageNames"라는 이름의 ImageBox에는 스크롤 상자 유형 목록에 연결된 일반 get / set 문자열 캐스트 메서드가 포함되어 있습니다. 이미지의 이름은 .bmp 엔딩을 제외하고 목록의 연결된 이름과 동일합니다. 비트 맵이 리소스로 드래그됩니다.

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가 자동으로 해당 공백을 "_"(들)로 바꿉니다. 자원의 이름을 지정할 때 공백은 유효한 문자가 아니기 때문입니다. 그래서 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

이미지 형식 (bmp, png, ...)을 알 필요가 없으므로 Image.FromStream을 사용하는 것이 좋습니다.


5

JDS의 답변이 가장 효과적이었습니다. C # 예제 로딩 이미지 :

  • 이미지를 리소스로 포함 (프로젝트 트리-> 리소스, 마우스 오른쪽 버튼을 클릭하여 원하는 파일을 추가하십시오 ImageName.png)
  • 임베디드 리소스 (프로젝트 트리-> 리소스-> ImageName.png, 마우스 오른쪽 버튼으로 속성 선택)
  • .png 파일 형식 (.bmp .jpg도 정상이어야 함)

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

다음 사항에 유의하십시오.

  • 리소스 이미지 파일은 "ImageName.png"이며 파일 확장자는 생략해야합니다.
  • ProjectName은 "어셈블리 이름"으로보다 적절하게 이해 될 수 있으며 이는 프로젝트-> 속성 페이지의 해당 텍스트 항목입니다.

예제 코드 줄은 VisualStudio 2015 Community를 사용하여 성공적으로 실행됩니다.


4

bmp를 다음과 같이 var에 저장할 수도 있습니다.

var bmp = Resources.ImageName;

그것이 도움이되기를 바랍니다!


2

이상하게도 디자이너를 파고 들면 훨씬 간단한 접근 방식이 보입니다.

이미지는 .Properties.Resources에서 사용 가능한 것 같습니다.

이미지에 컨트롤을 붙여 넣는 것만으로 이미지를 사용하고 있습니다.

(Net 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.