コード例 #1
0
        public MainWindow()
        {
            InitializeComponent();

            IniUtl = new InifileUtils();
            Path   = new ImgPath();

            UpdateIni(SG.get);
            UpdateWindow(SG.set);
        }
コード例 #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));
        }