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