[C#] 코드에서 WPF 이미지 소스 설정

코드에서 WPF 이미지의 소스를 설정하려고합니다. 이미지는 프로젝트에서 리소스로 포함됩니다. 예제를 보면서 아래 코드를 생각해 냈습니다. 어떤 이유로 든 작동하지 않습니다-이미지가 표시되지 않습니다.

디버깅하여 스트림에 이미지 데이터가 포함되어 있음을 알 수 있습니다. 무슨 일이야?

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;

아이콘은 다음과 같이 정의됩니다. <Image x:Name="_icon" Width="16" Height="16" />



답변

당신과 같은 문제를 겪고 약간의 독서를 한 후에 솔루션 팩 URI를 발견했습니다 .

코드에서 다음을 수행했습니다.

Image finalImage = new Image();
finalImage.Width = 80;
...
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png");
logo.EndInit();
...
finalImage.Source = logo;

또는 다른 BitmapImage 생성자를 사용하여 더 짧게 만듭니다.

finalImage.Source = new BitmapImage(
    new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));

URI는 여러 부분으로 나뉩니다.

  • 권위: application:///
  • 경로 : 참조 된 어셈블리로 컴파일 된 리소스 파일의 이름입니다. 경로는 다음 형식을 따라야합니다.AssemblyShortName[;Version][;PublicKey];component/Path

    • AssemblyShortName : 참조 된 어셈블리의 짧은 이름입니다.
    • ; Version [선택 사항] : 리소스 파일이 포함 된 참조 된 어셈블리의 버전입니다. 짧은 이름이 동일한 둘 이상의 참조 된 어셈블리가로드 될 때 사용됩니다.
    • ; PublicKey [선택 사항] : 참조 된 어셈블리에 서명하는 데 사용 된 공개 키. 짧은 이름이 동일한 둘 이상의 참조 된 어셈블리가로드 될 때 사용됩니다.
    • ; component : 참조되는 어셈블리가 로컬 어셈블리에서 참조되도록 지정합니다.
    • / 경로 : 참조 된 어셈블리 프로젝트 폴더의 루트에 상대적인 경로를 포함한 리소스 파일의 이름.

세 개의 슬래시는 이후 application:에 쉼표로 교체해야합니다.

참고 : 팩 URI의 권한 구성 요소는 패키지를 가리키는 임베디드 URI이며 RFC 2396을 준수해야합니다. 또한 “/”문자는 “,”문자 및 “%”와 같은 예약 문자로 바꿔야합니다. “?” 탈출해야합니다. 자세한 내용은 OPC를 참조하십시오.

물론 이미지의 빌드 작업을로 설정했는지 확인하십시오 Resource.


답변

var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);

그러면 “WpfApplication1″이라는 어셈블리에서 “Build Action”이 “Resource”로 설정된 “Images”폴더에 “Untitled.png”라는 이미지가로드됩니다.


답변

이것은 약간 적은 코드이며 한 줄로 수행 할 수 있습니다.

string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png";
_image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;


답변

아주 쉽게:

메뉴 항목의 이미지를 동적으로 설정하려면 다음을 수행하십시오.

MyMenuItem.ImageSource = 
    new BitmapImage(new Uri("Resource/icon.ico",UriKind.Relative));

“icon.ico”는 어디에나있을 수 있으며 (현재 ‘Resources’디렉토리에 위치) Resource로 링크되어야합니다.


답변

이것을 한 줄로 줄일 수도 있습니다. 이것은 기본 창에 아이콘을 설정하는 데 사용한 코드입니다. .ico 파일이 내용으로 표시되어 출력 디렉토리로 복사되고 있다고 가정합니다.

 this.Icon = new BitmapImage(new Uri("Icon.ico", UriKind.Relative));


답변

가장 간단한 방법 :

var uriSource = new Uri("image path here");
image1.Source = new BitmapImage(uriSource);


답변

시도해 보셨습니까?

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
_icon.Source = bitmap;