개발/C#

C# Resource 이미지 로드

FA1976 2018. 4. 3. 12:23

C# Resources 에 이미지 로드하기


Load image from resources in C# 하는 방법입니다. 쉽게 프로젝트를 관리할때 Resource 폴더에 이미지를 넣어둡니다. 이렇게 넣어둔 파일은 Bmp 함수에서 로드할때는 경로를 지정합니다. 상대경로로 지정을 하여 사용하게 되면 debug 모드에서는 정상적으로 사용할 수 있습니다. 하지만 ClickOnce나 Setup로 배포파일을 만들게 되면 상대경로가 달라지게 되어 이미지를 로드 못하는 오류가 발생합니다. 예를 들어 개발자가 프로젝트를 개발할때의 실행파일 경로는 debug 폴더안에 exe파일이 존재하고 실제 필요한 이미지는 그 상위 프로젝트 폴더의 Resource 폴더에 들어 있는 경우입니다. 이런 경우 ..\..\Resource 경로의 이미지 파일을 로드합니다. 하지만 실제로 배포한 프로젝트의 파일은 현재경로의 Resource 폴더의 이미지를 찾게 되어 이미지를 로드 못합니다. 이런경우 프로젝트의 이미지를 관리하면서 배포 할 수 있는지에 대해서 설명하겠습니다.


Load image from resources in C#


참고사이트입니다.
1) http://stackoverflow.com/questions/1192054/load-image-from-resources-in-c
2) http://geniusds.tistory.com/26

기존 상대경로로 이미지를 로드하는 경우 
1Bitmap normalBmp = new Bitmap("..\\..\\Resources\\AllowDrop.png"); 
2
Bitmap dropBmp = new Bitmap("..\\..\\Resources\\NoDrop.png");
// 상대경로로 구하여 배포시 오류가 발생할 수 있습니다.

ResourceManager 을 이용한 경로 구하기 1 ResourceManager rm = Messenger.Properties.Resources.ResourceManager; 2 Bitmap normalBmp = (Bitmap)rm.GetObject("AllowDrop"); 3 Bitmap dropBmp = (Bitmap)rm.GetObject("NoDrop"); 4 5 MyNormalCursor = new Cursor(normalBmp.GetHicon()); 6 MyNoDropCursor = new Cursor(dropBmp.GetHicon());

Resource 에 이미지 추가하기



Resource 객체에 .(점)을 찍어 인텔리센스 기능을 사용해보면 추가된 이미지가 없는 경우가 있습니다. 이런경우 관리하는 폴더에 우선 이미지를 기존 항목을 선택하여 추가합니다.






추가된 이미지는 포함 리소스로 변경합니다. 사실 이렇게 해도 포함 리소스에 나오지 않는 경우가 있습니다. 전 리소스 파일이기 때문에 컴파일 할 필요가 없기 때문에 [없음]으로 빌드 작업을 선택하였습니다.





그리고 폼 디자인에서 PictureBox 객체의 BackgroundImage 의 속성을 눌러서 [프로젝트 리소스 파일(P)]을 선택합니다. 가져오기 버튼을 눌러서 Resource 객체에 추가하고 싶은 이미지를 추가합니다. 이런 작업을 거치면 인텔리센스을 할때 정상적으로 이미지를 불러 옵니다. ResourceManager 클래스를 이용하여 리소스를 관리할 수 도 있습니다. 

다른 방법으로는 네임스페이스로 접근하는 방법입니다.
var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage); 

또는 Bitmap bmp = new Bitmap(Resources.myImage); 로 직접 리소스의 이미지를 접근하여 불러 올 수 있습니다.
개인적으로 파일명을 알고 있을 경우에는 ResourceManager 클래스를 이용해서 접근하는 것이 편했습니다.
ResourceManager rm = Resources.ResourceManager;
Bitmap myImage = (Bitmap)rm.GetObject("myImage");


포함되어 있는 리소스의 경우는 아래와 같이 GetManifestResourceStream 으로 Stream 하여 리소스를 불러 올 수 있습니다.

string name = "Resources.myimage.jpg"
string namespace = "MyCompany.MyNamespace";
string resource = namespace + "." + name;
Bitmap image = new Bitmap(type.Assembly.GetManifestResourceStream(resource));


출처: http://ndolson.com/1525 [엔돌슨의 IT이야기]