午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

WPF、アプリの実行ファイルに画像ファイルを埋め込んで、それを取り出して表示するまでの手順メモ

 
デザイン画面

f:id:gogowaten:20191214102016p:plain

イメージ 3
画像を表示するようの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"));
        }

    }
}

 
 
埋め込む画像はこれ
イメージ 1
ファイルのパスは
D:\ブログ用\テスト用画像\HSVRectValue.png
だった

 
MainWindow.xaml.csの画面

f:id:gogowaten:20191214102035p:plain

最初の画面
 

準備
  1. ソリューションエクスプローラーのプロジェクト名の、右クリックメニューから、追加→既存項目で画像ファイルを追加する
  2. 追加した画像の右クリックメニューからプロパティで、ビルドアクションを埋め込みリソースに変更

1. 画像ファイル追加
ソリューションエクスプローラ
イメージ 5
だいたいこんな感じになっている
 
 
埋め込む場所はプロジェクト
イメージ 6
「20190331_画像埋め込み」ってのが今回のプロジェクト名
ここに埋め込むのでここを右クリックして
 
 
イメージ 7
右クリックメニューから
追加→既存の項目クリックで

ファイル選択画面

f:id:gogowaten:20191214102059p:plain

 

f:id:gogowaten:20191214102114p:plain

ファイルのパスがわかっていればそれを入れて追加
 
画像を見て選ぶなら右下の

f:id:gogowaten:20191214102130p:plain

ファイルの種類をイメージファイルにして
 

f:id:gogowaten:20191214102143p:plain

選んで追加ボタンクリックで追加される
 
 
ソリューションエクスプローラーで確認
イメージ 12
プロジェクトに画像が追加された
 
 
2. ビルドアクションを埋め込みリソースに変更
イメージ 13
右クリックメニューのプロパティから
 
 
イメージ 14
ビルドアクションがResourceになっているので
右の∨をクリックして
 
 
イメージ 15
リストから埋め込みリソースを選択
 
 
イメージ 16
変更完了
 
これで準備が整った
イメージ 12
20190331_画像埋め込み.HSVRectValue.png
 
 
あとはC#
MyImage.Source = BitmapFrame.Create(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("_20190331_画像埋め込み.HSVRectValue.png"));
これを書いて実行すると
イメージ 17
表示された!
 
 
さっき1行で書いたのを分けて書いてみると
System.Reflection.Assembly sra = System.Reflection.Assembly.GetExecutingAssembly();
var bf = BitmapFrame.Create(sra.GetManifestResourceStream("_20190331_画像埋め込み.HSVRectValue.png"));
MyImage.Source = bf;

f:id:gogowaten:20191214102205p:plain

 
12行目、アプリの実行ファイルを取得している感じ?

f:id:gogowaten:20191214102217p:plain

完全に理解した(わからん)
 
そこからGetManifestResourceStreamっていうメソッドに、埋め込んだ画像のパスを渡すと画像が取り出せた
画像のパスは「プロジェクト名.画像ファイル名」
イメージ 21
プロジェクト名というか4行目のnamespaceの名前でいいのかな
これに.ピリオドをつけたあとに画像ファイル名の
20190331_画像埋め込み.HSVRectValue.png
これを指定
 
GetManifestResourceStream
イメージ 22
わからんけど、名前の通りStreamで取り出せるみたい?
 
StreamからBitmapにするのにBitmapFrameのCreateメソッドを使用
イメージ 20
これでBitmapFrameとして取り出せたので
最後に
イメージ 23
ImageのSourceに指定して完了
 
 
実行ファイルだけで表示されるのか確認
イメージ 24
実行ファイルだけ別の場所にコピーして実行
 

f:id:gogowaten:20191214102238p:plain

おk
 
失敗例
ビルドアクションがResourceのままだと

f:id:gogowaten:20191214102248p:plain

取り出そうとしたところで無いって言われる
 
 
完走した感想
WindowsFormアプリのときに同じことがあったんだけど、WPFでは取り出しのところが違うみたいで、同じ方法ではできなかった
 
この前の市松模様画像
これもマスの大きさや色が固定でもいいなら、今回の方法で使ったほうがラクかなあ
DLLファイルも同じように埋め込んで取り出せて参照できればいいのにねえ
 
 
 
 
参照したところ
 
ギットハブ