WPF画像リソースの保存

2008年12月07日に質問されました。  ·  閲覧回数 462.8k回  ·  ソース

driis picture
2008年12月07日

説明のために10〜20個の小さなアイコンと画像が必要なWPFアプリケーションの場合、これらを埋め込みリソースとしてアセンブリに保存するのが正しい方法ですか?

その場合、画像コントロールが埋め込みリソースから画像を読み込むようにXAMLで指定するにはどうすればよいですか?

回答

Drew Noakes picture
2009年03月04日
484

画像を複数の場所で使用する場合は、画像データを1回だけメモリにロードしてから、すべてのImage要素間で共有する価値があります。

これを行うには、リソースとしてBitmapSourceをどこかに作成します。

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

次に、コードで次のようなものを使用します。

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

私の場合、 Contentだけでなく、 Resourceビルドアクションを持つようにImage.pngファイルを設定する必要があることがわかりました。 これにより、コンパイルされたアセンブリ内でイメージが運ばれます。

Nuno Rodrigues picture
2010年03月10日
184

画像やビデオなどを使用するためのベストプラクティスは次のとおりです。

  • ファイルの「ビルドアクション」「コンテンツ」に変更します。 ビルドディレクトリにコピーを必ずチェックしてください。
    • ソリューションエクスプローラーウィンドウの[右クリック]メニューにあります。
  • 次の形式の画像ソース
    • "/«YourAssemblyName»;コンポーネント/«YourPath»/«YourImage.png»"

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

利点:

  • ファイルはアセンブリに埋め込まれていません。
    • Resource Managerは、(ビルド時に)リソースが多すぎるとメモリオーバーフローの問題を引き起こします。
  • アセンブリ間で呼び出すことができます。
Craig picture
2011年02月14日
49

一部の人々は、コードでこれを行うことについて質問していて、答えを得ていません。

何時間もかけて検索したところ、非常に簡単な方法が見つかりましたが、例が見つからなかったので、ここで画像を処理する方法を共有します。 (私のものは.gifでした)

概要:

ImageSourceの「宛先」が好むように見えるBitmapFrameを返します。

使用する:

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);
}

学習:

私の経験から、パック文字列は問題ではありません。ストリームを確認してください。特に、初めて読み取る場合は、ポインタがファイルの終わりに設定されているため、再度読み取る前にゼロに再設定する必要があります。

これにより、この作品が私のために持っていればよかった多くの時間を節約できることを願っています!

Eric Ouellet picture
2012年03月16日
44

私の画像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パックURIを参照してください:
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

ema picture
2008年12月08日
42

はい、それは正しい方法です。

パスを使用するだけで、リソースファイル内の画像を使用できます。

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

イメージファイルのビルドアクションを「リソース」に設定する必要があります。

techfan picture
2010年04月14日
14

リソースの使用方法の詳細: WPFアプリケーションリソース、コンテンツ、およびデータファイル

そして、それらを参照する方法については、「WPFでURIをパックする」をお読みください。

要するに、参照/参照アセンブリからリソースを参照する手段さえあります。

JoanComasFdz picture
2011年08月23日
5
  1. Visual Studio 2010 ProfessionalSP1。
  2. .NET Framework4クライアントプロファイル。
  3. プロジェクトプロパティのリソースとしてPNG画像が追加されました。
  4. リソースフォルダ内の新しいファイルが自動的に作成されます。
  5. リソースに設定されたアクションをビルドします。

これは私のために働いた:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
user42467 picture
2008年12月08日
3

Blendを使用している場合は、非常に簡単で、 Source属性の正しいパスを取得するのに問題がないように、プロジェクトパネルからデザイナーに画像をドラッグアンドドロップするだけです。

Sanjay Ranavaya picture
2018年04月24日
3

はい、それは正しい方法です。 パスを使用して、リソースファイル内の画像を使用できます。

<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>
Raghulan Gowthaman picture
2015年01月09日
-4

以下が機能し、設定される画像はプロパティのリソースです。

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