WPF、アプリの実行ファイルに画像ファイルを埋め込んで、それを取り出して表示するまでの手順メモ
デザイン画面
画像を表示するようのImageを追加しただけ
using System.Windows;
using System.Windows.Media.Imaging;
namespace _20190331_画像埋め込み
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
System.Reflection.Assembly sra = System.Reflection.Assembly.GetExecutingAssembly();
var bf = BitmapFrame.Create(sra.GetManifestResourceStream("_20190331_画像埋め込み.HSVRectValue.png"));
MyImage.Source = bf;
//1行で
//MyImage.Source= BitmapFrame.Create(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("_20190331_画像埋め込み.HSVRectValue.png"));
}
}
}
だった
MainWindow.xaml.csの画面
準備
- ソリューションエクスプローラーのプロジェクト名の、右クリックメニューから、追加→既存項目で画像ファイルを追加する
- 追加した画像の右クリックメニューからプロパティで、ビルドアクションを埋め込みリソースに変更
1. 画像ファイル追加
ソリューションエクスプローラー
だいたいこんな感じになっている
埋め込む場所はプロジェクト
「20190331_画像埋め込み」ってのが今回のプロジェクト名
ここに埋め込むのでここを右クリックして
右クリックメニューから
追加→既存の項目クリックで
ファイル選択画面
ファイルのパスがわかっていればそれを入れて追加
画像を見て選ぶなら右下の
ソリューションエクスプローラーで確認
プロジェクトに画像が追加された
2. ビルドアクションを埋め込みリソースに変更
右クリックメニューのプロパティから
ビルドアクションがResourceになっているので
右の∨をクリックして
リストから埋め込みリソースを選択
変更完了
これで準備が整った
20190331_画像埋め込み.HSVRectValue.png
あとはC#で
MyImage.Source = BitmapFrame.Create(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("_20190331_画像埋め込み.HSVRectValue.png"));
これを書いて実行すると
表示された!
さっき1行で書いたのを分けて書いてみると
System.Reflection.Assembly sra = System.Reflection.Assembly.GetExecutingAssembly();
var bf = BitmapFrame.Create(sra.GetManifestResourceStream("_20190331_画像埋め込み.HSVRectValue.png"));
MyImage.Source = bf;
12行目、アプリの実行ファイルを取得している感じ?
完全に理解した(わからん)
そこからGetManifestResourceStreamっていうメソッドに、埋め込んだ画像のパスを渡すと画像が取り出せた
画像のパスは「プロジェクト名.画像ファイル名」
プロジェクト名というか4行目のnamespaceの名前でいいのかな
これに.ピリオドをつけたあとに画像ファイル名の
20190331_画像埋め込み.HSVRectValue.png
これを指定
GetManifestResourceStream
わからんけど、名前の通りStreamで取り出せるみたい?
StreamからBitmapにするのにBitmapFrameのCreateメソッドを使用
これでBitmapFrameとして取り出せたので
最後に
ImageのSourceに指定して完了
実行ファイルだけで表示されるのか確認
実行ファイルだけ別の場所にコピーして実行
おk
失敗例
ビルドアクションがResourceのままだと
完走した感想
WindowsFormアプリのときに同じことがあったんだけど、WPFでは取り出しのところが違うみたいで、同じ方法ではできなかった
この前の市松模様画像
これもマスの大きさや色が固定でもいいなら、今回の方法で使ったほうがラクかなあ
DLLファイルも同じように埋め込んで取り出せて参照できればいいのにねえ
参照したところ