public MainWindow() { InitializeComponent(); IniUtl = new InifileUtils(); Path = new ImgPath(); UpdateIni(SG.get); UpdateWindow(SG.set); }
// 実処理 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)); }