private async void Button_Execute_Click(object sender, RoutedEventArgs e) { UpdateWindow(SG.get); UpdateIni(SG.set); // 出力先にファイル出力可能か確認 try { System.IO.StreamWriter sw = new System.IO.StreamWriter( Path.SDstImg, false, System.Text.Encoding.Unicode); //TextBox1.Textの内容を書き込む sw.Write("Test"); //閉じる sw.Close(); } catch (Exception) { MessageBox.Show("コレ、書けないかも↓↓\n" + Path.SDstImg, "ムリぽ"); return; } // Progressクラスのインスタンスを生成 var spProg1 = new Progress <int>(ShowProgress1); var spProg2 = new Progress <int>(ShowProgress2); progressBar1.Maximum = Path.AsSrcImg.Length; progressBar1.Value = 0; progressBar2.Maximum = DEF.PERCENT_MAX; progressBar2.Value = 0; // 実処理実行 CoreResult coreResult = new CoreResult(); MosImgCore.ECode edRet = await MosImgCore.Do(Path, coreResult, spProg1, spProg2); if (edRet >= MosImgCore.ECode.Success) { TextBlock_Report.Text = "できたよー (⌒∇⌒) : 平均残差 = " + (int)Math.Sqrt(coreResult.dDeltaAve) + ", 最大残差 = " + (int)Math.Sqrt(coreResult.dDeltaMax); } else { TextBlock_Report.Text = "なんか失敗したっぽい。"; switch (edRet) { case MosImgCore.ECode.Er_ReadTgeImg: MessageBox.Show("コレ、読めないかも↓↓\n" + Path.STgtImg, "ムリぽ"); break; case MosImgCore.ECode.Er_LackSrcImg: MessageBox.Show("素材画像を確認したけど、実際に使える画像が少なすぎるかも...", "ムリぽ"); break; default: break; } } GC.Collect(); }
// 実処理 public static async Task <ECode> Do(ImgPath path, CoreResult coreResult, IProgress <int> spProg1, IProgress <int> spProg2) { Func <ECode> Job = () => { // ターゲット画像の読み込み Image imgTg = null; try { imgTg = Image.FromFile(path.STgtImg); } catch (Exception) { return(ECode.Er_ReadTgeImg); } Bitmap bmTg = new Bitmap(imgTg); // LetImgの配列を構築 List <ImageLet> aImgLet = MakeImageLets(path.AsSrcImg, spProg1); if (aImgLet.Count < DEF.SQR(DEF.LET_IMG_MIN_MIN)) { return(ECode.Er_LackSrcImg); } // 出力先の構築(取り敢えずオリジナル画像をリサイズして突っ込む) int iCelW, iCelH; CalcCelSize(imgTg, aImgLet, out iCelW, out iCelH); var bmTmp = new Bitmap(bmTg, DEF.LET_D * iCelW, DEF.LET_D * iCelH); var imgOut = new UMImage(bmTmp); bmTmp.Dispose(); // ターゲット画像Celの配列作成 List <ImageCel> aImgCel = MakeImageCels(imgTg, iCelW, iCelH); // 残差計算の処理 double dDeltaSum = 0; double dDeltaMax = 0; // モザイク処理 int iProg = 0; foreach (ImageCel imgCel in aImgCel) { int cy = (int)imgCel.pt.Y; int cx = (int)imgCel.pt.X; // 最も近いimgLetを選択 double dDelta = 0; int iSel = SelectImageLet(imgCel.aCol, aImgLet, out dDelta); ImageLet imgLet = aImgLet[iSel]; dDeltaSum += dDelta; dDeltaMax = Math.Max(dDelta, dDeltaMax); //for (int dy = 0; dy < DEF.LET_D; dy++) Parallel.For(0, DEF.LET_D, dy => { int y = cy * DEF.LET_D + dy; for (int dx = 0; dx < DEF.LET_D; dx++) { int x = cx * DEF.LET_D + dx; // 値の取得() imgOut.SetPixel(x, y, CommonUtils.ColorBlend(imgLet.bmData.GetPixel(dx, dy), 1, imgOut.GetPixel(x, y), 0)); } }); // 一度使ったimgLetはもう使わない aImgLet.RemoveAt(iSel); // どこにも属さないimgLetが溜まらないように、適度にシャッフル if (((iProg + 1) % (DEF.SEEK_MAX / 2)) == 0) { aImgCel = new List <ImageCel>(aImgCel.OrderBy(i => Guid.NewGuid()).ToArray()); } // プログレス処理 spProg2.Report((++iProg) * DEF.PERCENT_MAX / (iCelW * iCelH)); } coreResult.dDeltaAve = dDeltaSum / aImgCel.Count; coreResult.dDeltaMax = dDeltaMax; // ファイルを出力して開く using (Bitmap bmOut = imgOut.GetBitmap()) { bmOut.Save(path.SDstImg, System.Drawing.Imaging.ImageFormat.Jpeg); System.Diagnostics.Process.Start(path.SDstImg); } // お片付け imgTg.Dispose(); bmTg.Dispose(); return(ECode.Success); }; return(await Task.Run(Job)); }