programing

WPF 이미지 리소스 저장

showcode 2023. 4. 10. 22:25
반응형

WPF 이미지 리소스 저장

설명을 위해 10~20개의 작은 아이콘과 이미지를 필요로 하는 WPF 어플리케이션의 경우 이를 어셈블리에 내장된 리소스로 저장하는 것이 올바른 방법입니까?

이 경우 이미지 컨트롤이 내장된 리소스에서 이미지를 로드하도록 XAML에서 지정하는 방법은 무엇입니까?

이미지를 여러 곳에서 사용하는 경우 이미지 데이터를 메모리에 한 번만 로드한 후 공유합니다.Image요소들.

이를 수행하려면 를 리소스로 만듭니다.

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

그런 다음 코드에서 다음과 같은 것을 사용합니다.

<Image Source="{StaticResource MyImageSource}" />

제 경우엔, 제가 이 비디오의Image.png빌드 액션을 실시하기 위한 파일Resource뿐만 아니라Content그러면 이미지가 컴파일된 어셈블리 내에 저장됩니다.

이미지, 비디오 등을 사용하는 베스트 프랙티스는 다음과 같습니다.

  • 파일 "빌드 작업""내용"으로 변경합니다.Copy to build directory(빌드 디렉토리에 복사)를 선택해야 합니다.
    • Solution Explorer 창의 "우클릭" 메뉴에 있습니다.
  • 다음 형식의 이미지 소스:
    • "/"My Assembly Name"; 컴포넌트/"Your Path / / [ Your Image . png ]

<Image Source="/WPFApplication;component/Images/Start.png" />

이점:

  • 파일이 어셈블리에 포함되어 있지 않습니다.
    • 리소스 관리자가 너무 많은 리소스로 인해 메모리 오버플로 문제를 일으킵니다(빌드 시).
  • 어셈블리 간에 호출할 수 있습니다.

어떤 사람들은 답을 얻지 못한 채 암호로 이것을 하는 것에 대해 묻고 있다.

오랜 시간 동안 검색한 결과 매우 간단한 방법을 찾았는데, 아무런 예도 찾을 수 없었기 때문에 여기에서 이미지로 작동하는 내 방법을 공유합니다.(저는 .gif였습니다)

요약:.

ImageSource "destinations"가 좋아하는 비트맵 프레임을 반환합니다.

용도:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

방법:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

학습 내용:

경험상 팩 문자열은 문제가 되지 않습니다.스트림을 체크해 주세요.특히 처음 읽었을 때 포인터가 파일 끝에 설정되어 있고 다시 읽기 전에 포인터를 제로로 재설정해야 합니다.

이것으로 이 작품이 갖고 싶었던 많은 시간을 절약할 수 있기를 바랍니다!

실행 어셈블리에 리소스를 로드하기 위한 코드 내 이미지Freq.png폴더 안에 있었다Icons라고 정의되어 있습니다.Resource:

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

기능도 만들었습니다.

/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
    if (assembly == null)
    {
        assembly = Assembly.GetCallingAssembly();
    }

    if (pathInApplication[0] == '/')
    {
        pathInApplication = pathInApplication.Substring(1);
    }
    return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); 
}

사용방법(함수를 ResourceHelper 클래스에 배치한다고 가정):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

주의: 「WPF 의 MSDN Pack URI」를 참조해 주세요.
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

네, 맞습니다.

다음 경로만 사용하여 리소스 파일의 이미지를 사용할 수 있습니다.

<Image Source="..\Media\Image.png" />

이미지 파일의 빌드 작업을 "리소스"로 설정해야 합니다.

자원 사용방법 상세설명: WPF 응용 프로그램리소스, 콘텐츠 데이터 파일

참조 방법에 대해서는 "Pack URIs in WPF"를 참조하십시오.

즉, 참조/참조 어셈블리의 리소스를 참조하는 수단도 있습니다.

  1. Visual Studio 2010 Professional SP1.
  2. .NET Framework 4 클라이언트프로파일
  3. PNG 이미지가 프로젝트 속성에 리소스로 추가되었습니다.
  4. 리소스 폴더의 새 파일이 자동으로 생성됩니다.
  5. 빌드 작업을 리소스로 설정합니다.

이 방법은 효과가 있었습니다.

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />

Blend를 사용하는 경우 Source 속성의 올바른 경로를 쉽게 얻을 수 있도록 Project 패널에서 이미지를 디자이너로 드래그 앤 드롭하기만 하면 됩니다.

네, 맞습니다.다음 경로를 사용하여 리소스 파일의 이미지를 사용할 수 있습니다.

<StackPanel Orientation="Horizontal">
    <CheckBox  Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
    <Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
    <TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>

다음은 Drew Noakes의 답변을 바탕으로 리소스 사전을 만들고, 여기에 비트맵 이미지 리소스를 추가하고, 사용자 컨트롤에서 비트맵 이미지 리소스를 참조하기 위해 수행한 전체 단계입니다.

  1. Images폴더는 프로젝트 루트에 있습니다.
  2. MyImage.pngImages더입니니다다
  3. 서서 MyImage.png[ ]에서 [Set ], [Set ]를 선택합니다.Build Action로로 합니다.Resource.
  4. 를 만듭니다.이 이름은 다음과 같습니다.MainResourceDictionary.xaml:
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <BitmapImage x:Key="MyImageSource" UriSource="Images/MyImage.png" />
</ResourceDictionary>
  1. 컨트롤의 리소스 사전에 참조를 추가합니다.
<UserControl ...>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="MainResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    ...
  1. 컨트롤에서 이미지 리소스를 참조합니다.
<UserControl ...>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="MainResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    ...
    <Image Source="{DynamicResource ResourceKey=ServiceLevel1Source}" />
    ...

다음 작업이 수행되었으며 설정할 이미지는 속성의 리소스입니다.

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;

언급URL : https://stackoverflow.com/questions/347614/storing-wpf-image-resources

반응형