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

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

ただいまの
回答率

89.07%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,643

marche

score 7

現在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を使用しています。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • Hey_CH

    2016/11/20 20:39

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

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る