質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

4548閲覧

Filedialogクラス使用時の強制終了

marche

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/09/05 13:27

現在WPFで、imageの上に重ねたinkcanvasに落書きをして、書き込みとイメージソースを合成させて一枚の画像にして保存するアプリケーションを作っています。
大体の機能はできたのですが、exeファイルとして起動するとファイルを開いたり保存する際に「動作を停止しました」と表示され強制終了してしまいます。
同じPC上でもvisual studioから起動した場合には正常に動作するので環境ではなくソースのせいだと思うのですが、どこが悪いのか分からない為教えて頂きたく質問いたしました。

###該当のソースコード
C#
// ファイルを開く
private void openBtn_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();

dialog.Filter = "全てのファイル(*.*)|*.*"; Nullable<bool> result = dialog.ShowDialog(); if (result == true) { MagickReadSettings settings = new MagickReadSettings(); settings.Density = new Density(300); //ファイルを読み込む ImageMagick.MagickImage img = new ImageMagick.MagickImage(dialog.FileName, settings); //Png形式で保存する img.Write("file1.png"); //imgの破棄 img.Dispose(); BitmapImage bit = new BitmapImage(); bit.BeginInit(); string ip = "file1.png"; string full = System.IO.Path.GetFullPath(ip); //Uriオブジェクトを作成する Uri ip_path = new Uri(full); bit.UriSource = ip_path; bit.EndInit(); image.Source = bit; canvas.Width = canvas2.Width = image.Source.Width; canvas.Height = canvas2.Height = image.Source.Height; } } // 画像保存 private void saveBtn1_Click(object sender, RoutedEventArgs e) { string file = "file2.png"; string fullPath = System.IO.Path.GetFullPath(file); Uri path = new Uri(fullPath); Convert1(path,canvas); string file2 = "file3.png"; string fullPath2 = System.IO.Path.GetFullPath(file2); Uri path2 = new Uri(fullPath2); Convert2(path2, canvas2); } // Inkcanvasを画像化&合成 public void Convert1(Uri path, InkCanvas canvas) { if (path == null) return; Transform transform = canvas.LayoutTransform; canvas.LayoutTransform = null; System.Windows.Size size = new System.Windows.Size(canvas.ActualWidth, canvas.ActualHeight); canvas.Measure(size); canvas.Arrange(new Rect(size)); RenderTargetBitmap renderBitmap = new RenderTargetBitmap( (int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Default); renderBitmap.Render(canvas); using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create)) { PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); encoder.Save(outStream); } canvas.LayoutTransform = transform; } // Inkcanvas2を画像化&合成 public void Convert2(Uri path2, InkCanvas canvas2) { if (path2 == null) return; Transform transform = canvas2.LayoutTransform; canvas2.LayoutTransform = null; System.Windows.Size size2 = new System.Windows.Size(canvas2.ActualWidth, canvas2.ActualHeight); canvas2.Measure(size2); canvas2.Arrange(new Rect(size2)); RenderTargetBitmap renderBitmap2 = new RenderTargetBitmap( (int)size2.Width, (int)size2.Height, 96d, 96d, PixelFormats.Default); renderBitmap2.Render(canvas2); using (FileStream outStream2 = new FileStream(path2.LocalPath, FileMode.Create)) { PngBitmapEncoder encoder2 = new PngBitmapEncoder(); encoder2.Frames.Add(BitmapFrame.Create(renderBitmap2)); encoder2.Save(outStream2); } canvas2.LayoutTransform = transform; // 画像合成 System.Drawing.Bitmap img1 = new System.Drawing.Bitmap("file1.png"); System.Drawing.Bitmap img2 = new System.Drawing.Bitmap("file3.png"); System.Drawing.Bitmap img3 = new System.Drawing.Bitmap(img1); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img3); g.DrawImage(img2, 0, 0, img3.Width, img3.Height); g.Dispose(); img1.Dispose(); img2.Dispose(); img3.Save("newImage.png", System.Drawing.Imaging.ImageFormat.Png); System.Drawing.Bitmap img2_2 = new System.Drawing.Bitmap("file2.png"); System.Drawing.Bitmap img3_2 = new System.Drawing.Bitmap(img3); System.Drawing.Graphics g2 = System.Drawing.Graphics.FromImage(img3_2); g2.DrawImage(img2_2, 0, 0, img3_2.Width, img3_2.Height); g2.Dispose(); img3.Dispose(); img2_2.Dispose(); img3_2.Save("newImage2.png", System.Drawing.Imaging.ImageFormat.Png); // 名前をつけて保存 SaveFileDialog fileDialog2 = new SaveFileDialog(); fileDialog2.RestoreDirectory = true; fileDialog2.Filter = "PNGファイル(.png)|*.png"; fileDialog2.DefaultExt = "png"; Nullable<bool> result2 = fileDialog2.ShowDialog(); if (result2 == true) { string fileName2 = fileDialog2.FileName; string png2 = System.IO.Path.GetExtension(fileName2).ToLower(); FileStream fs2 = new FileStream(fileName2, FileMode.Create); fs2.Close(); System.IO.File.Copy("newImage2.png", fileName2, true); } }

言語はC#、開発環境はvisual studio 2012 for Desktopを、ファイルを読み込む際にライブラリmagick.netを使用しています。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hey_CH

2016/11/20 11:39

EXEとして起動した場合、必要なDLLは存在していますか?(たとえば、bin\DebugフォルダにEXEが存在する状態でそのエラーが発生しますか?)
guest

回答1

0

デバッグ時でうまくいくのに exe を直接実行した時にはうまくいかない場合、一番に調べるのはその時のカレントディレクトリです。特に相対パスが多用されており、そのファイルがあると決め打ちされているので、ファイルが見当たらない場合に例外が発生するかもしれません。

GetExecuteAssembly() を使用して現在実行中のアセンブリを取得し、その Location プロパティからアセンブリのディレクトリを取得し、カレントディレクトリをそこに移すかそこを起点にファイルのフルパスを作成してみてください。.NET Core で AppDomain 周りが色々と変わったので、なるべくなら AppDomain.CurrentDomain.BaseDirectory は使わない方がいいと思います。

投稿2021/02/01 10:19

編集2021/02/01 10:23
Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問