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();
        }
Example #2
0
        //  実処理
        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));
        }