C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

プロジェクト内の画像ファイルが正しく読み込まれない

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■86403 / inTopicNo.1)  プロジェクト内の画像ファイルが正しく読み込まれない
  
□投稿者/ namu (3回)-(2018/01/26(Fri) 10:14:37)

分類:[C#] 

当方、Visual Studio 2017でC#を用いたWPFアプリケーションを作っています。

今回、ソース内の/sample/blank.pngを読み込み、path(絶対アドレス)に保存したいのですが、途中でエラーを吐いてしまいます。
具体的に申しますと、以下のように記述すると成功するのですが、7行目の"ImageBox.Source = blank;"を抜くとエラーを吐きます。

BitmapImage blank = new BitmapImage();
                try
                {
                    blank.BeginInit();
                    blank.UriSource = new Uri("/sample/blank.png", UriKind.Relative);
                    blank.EndInit();
                    ImageBox.Source = blank;
                    double wscale = 152d / blank.PixelWidth;
                    double hscale = 152d / blank.PixelHeight;
                    var transformedblank = new TransformedBitmap(blank, new ScaleTransform(wscale, hscale));
                    using (Stream stream = new FileStream(path, FileMode.Create))
                    {
                        PngBitmapEncoder encoder = new PngBitmapEncoder();
                        encoder.Frames.Add(BitmapFrame.Create(transformedblank));
                        encoder.Save(stream);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

どのようにすれば無駄な行を入れずに、エラーを吐かなくなるのでしょうか?

引用返信 編集キー/
■86404 / inTopicNo.2)  Re[1]: プロジェクト内の画像ファイルが正しく読み込まれない
□投稿者/ Hongliang (606回)-(2018/01/26(Fri) 11:05:14)
エラーが出るのであれば、そのメッセージを書いてください。
質問される側には意味不明な文言であっても、回答する側には現象を推測する手掛かりになり得ます。
また、例外オブジェクトのMessageだけではなく、ToString()した全体を確認するようにした方がいいです(ただしBBS等に張り付ける場合はパスに名前が出てたりしてないかチェック)。

さて、メッセージは「パスの一部が見つかりませんでした」という感じのものでしょうか。
であれば、URIの記述に問題があります。
UIの要素ツリー上でURIが解釈される場合は良いようにやってくれるようですが、普通にリソースをURIで記述する場合、pack URIという記法を使用する必要があります。

一般的なWPFアプリケーションであれば、以下のような構造になります。
pack://application:,,,[アセンブリ名];component/[ディレクトリ構造]/[ファイル名]

例えば、hogehoge.exeを出力するhogeという名前のプロジェクトで、プロジェクトの直下にfugaというディレクトリを作成し、そこにpiyo.jpgというファイルをResourceとして配置した場合、以下のURIになります。
pack://application:,,,hogehoge;component/fuga/piyo.jpg
// もちろんUriKindはRelativeではないです。
引用返信 編集キー/
■86405 / inTopicNo.3)  Re[1]: プロジェクト内の画像ファイルが正しく読み込まれない
□投稿者/ 魔界の仮面弁士 (1552回)-(2018/01/26(Fri) 11:07:05)
No86403 (namu さん) に返信
> 途中でエラーを吐いてしまいます。
どの行で、何という例外が発生しているのかも明示していただけると回答しやすいです。
次回質問時にはご留意ください。


> 7行目の"ImageBox.Source = blank;"を抜くとエラーを吐きます。
この行を実行する前は、blank.BaseUri が null で、
この行を実行することで、blank.BaseUri がセットされているから、とか。

スキームを付与して、UriKind.Absolute 指定に切り替えるとか、
あるいは、UriKind.Relative のままにするのであれば、
blank.BaseUri = BaseUriHelper.GetBaseUri(this);
などとしてみるとどうでしょうか。
引用返信 編集キー/
■86428 / inTopicNo.4)  Re[2]: プロジェクト内の画像ファイルが正しく読み込まれない
□投稿者/ namu (4回)-(2018/01/27(Sat) 01:52:00)
No86404 (Hongliang さん) に返信
おっしゃる通りのエラーメッセージでした。
blank.BeginInit();
blank.UriSource = new Uri("pack://application:,,,/sample/blank.png");
blank.EndInit();
としたところ、上記で言うところの7行目を記述しなくとも動作することを確認しました。
ありがとうございます。

魔界の仮面弁士さんもありがとうございました。
なぜ7行目を行うことによってエラーが起こらなくなるのかがわからなかったのですが、blank.BaseUriというものがあったのですね。
試しに行ったところこちらの方法でも動くことが確認できました。有難うございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ