Beispiel #1
0
        public static void Run(VideoFileReader reader, VideoFileWriter writer, MultiFrameFunctions function, BackgroundWorker renderWorker)
        {
            switch (function)
            {
            case MultiFrameFunctions.PhotoFinish:
                PhotoFinish(reader, writer, renderWorker);
                break;

            case MultiFrameFunctions.Swirl:
                break;
            }
        }
Beispiel #2
0
        public AppForm()
        {
            //
            //Main window settings
            //
            Size            = new Size(800, 450);
            FormBorderStyle = FormBorderStyle.FixedDialog;
            Text            = "UVEC"; //???
            Icon            = new Icon(@"mmfiles\icon.ico");

            //
            //Top subspace of main window
            //
            ChosenFile.Enabled  = false;
            ChosenFile.Location = new Point(10, 10);
            ChosenFile.Size     = new Size(ClientSize.Width - 5 - 30 - 20,// 10*2 - отступ справа и слева
                                           Size.Height);
            ChosenFile.TextAlign = HorizontalAlignment.Center;
            ChosenFile.Text      = "Choose file ->";
            ChosenFile.ReadOnly  = true;

            OpenFile.Title            = "Open file";
            OpenFile.Filter           = "Video Files|*.mp4;*.avi";
            OpenFile.RestoreDirectory = true;

            OpenFileButton.Size     = new Size(30, ChosenFile.Size.Height + 2);
            OpenFileButton.Text     = "...";
            OpenFileButton.Location = new Point(ChosenFile.Right + 5, ChosenFile.Top - 1);

            Controls.Add(ChosenFile);
            Controls.Add(OpenFileButton);

            //
            //Left middle subspace
            //
            PreviewPictureBox.Location = new Point(10, ChosenFile.Bottom + 10);
            PreviewPictureBox.Size     =
                new Size(
                    (ClientRectangle.Height - ChosenFile.Bottom + 10 - 100) / 9 * 16, // /9 & *16 - соотношение сторон 16 на 9
                    ClientRectangle.Height - ChosenFile.Bottom + 10 - 100);           // 50 - отступ снизу
            PreviewPictureBox.Image = new Bitmap(PreviewPictureBox.Width, PreviewPictureBox.Height);
            using (Graphics g = Graphics.FromImage(PreviewPictureBox.Image)){ g.Clear(Color.Black); } //заливка черным

            PreviewLabel.Text      = "Preview";
            PreviewLabel.ForeColor = Color.White;
            PreviewLabel.BackColor = Color.Transparent;

            Controls.Add(PreviewPictureBox);
            PreviewPictureBox.Controls.Add(PreviewLabel);

            //
            //Left bottom subspace
            //
            TimeLineLabel.Text      = "Time Line";
            TimeLineLabel.BackColor = Color.Transparent;
            TimeLineLabel.TextAlign = ContentAlignment.TopCenter;
            TimeLineLabel.Location  = new Point(10, PreviewPictureBox.Bottom + 10);
            TimeLineLabel.Size      = new Size(PreviewPictureBox.Width, ClientSize.Height - PreviewPictureBox.Bottom - 10 - 10);

            TimeLineStart.Location  = new Point(0, 0);
            TimeLineStart.BackColor = Color.Transparent;
            TimeLineStart.Text      = "00.00";

            TimeLineEnd.Location  = new Point(TimeLineLabel.Width - 100, 0); //100 - отступ справа
            TimeLineEnd.BackColor = Color.Transparent;
            TimeLineEnd.Text      = "00.00";
            TimeLineEnd.TextAlign = ContentAlignment.TopRight;

            TimeLine.TickStyle     = TickStyle.Both;
            TimeLine.TickFrequency = 5;
            TimeLine.Maximum       = 100;
            TimeLine.Minimum       = 0;
            TimeLine.Location      = new Point(0, 20);
            TimeLine.Width         = TimeLineLabel.Width;
            TimeLine.Enabled       = false;

            Controls.Add(TimeLineLabel);
            TimeLineLabel.Controls.Add(TimeLine);
            TimeLineLabel.Controls.Add(TimeLineStart);
            TimeLineLabel.Controls.Add(TimeLineEnd);

            //
            //Progress second layout
            //
            ProgressLabel.Text      = "Progress";
            ProgressLabel.BackColor = Color.Transparent;
            ProgressLabel.TextAlign = ContentAlignment.TopLeft;
            ProgressLabel.Location  = new Point(10, PreviewPictureBox.Bottom + 10);
            ProgressLabel.Size      = new Size(PreviewPictureBox.Width, ClientSize.Height - PreviewPictureBox.Bottom - 10 - 5);

            ProgressVisualBar.Location = new Point(0, 25);
            ProgressVisualBar.Width    = ProgressLabel.Width;
            ProgressVisualBar.Maximum  = 1000;
            ProgressVisualBar.Minimum  = 0;

            ProgressTimeRemaining.Location  = new Point(ProgressVisualBar.Right - 150, ProgressVisualBar.Top - 15);
            ProgressTimeRemaining.BackColor = Color.Transparent;
            ProgressTimeRemaining.Size      = new Size(150, 15);
            ProgressTimeRemaining.Text      = "Time remaining: 00:00:00.00";

            ProgressTimeElapsed.Location  = new Point(ProgressTimeRemaining.Left - 10 - 150, ProgressTimeRemaining.Top);
            ProgressTimeElapsed.BackColor = Color.Transparent;
            ProgressTimeElapsed.Size      = ProgressTimeRemaining.Size;
            ProgressTimeElapsed.Text      = "Time elapsed: 00:00:00.00";

            ProgressPercent.Location  = new Point(ProgressVisualBar.Right - 145, ProgressVisualBar.Bottom);
            ProgressPercent.BackColor = Color.Transparent;
            ProgressPercent.Text      = "Percent completed: 0%";
            ProgressPercent.Size      = new Size(145, 15);

            ProgressLabel.Controls.Add(ProgressVisualBar);
            ProgressLabel.Controls.Add(ProgressTimeElapsed);
            ProgressLabel.Controls.Add(ProgressTimeRemaining);
            ProgressLabel.Controls.Add(ProgressPercent);

            //
            //Right subspace
            //
            EffectsPanelLabel.Location = new Point(PreviewPictureBox.Right + 10, PreviewPictureBox.Top);
            EffectsPanelLabel.Size     = new Size(ClientSize.Width - PreviewPictureBox.Right - 10 - 10,
                                                  ClientSize.Height - PreviewPictureBox.Top - 10 - 10);//10 - отступы
            EffectsPanelLabel.BackColor = Color.Transparent;
            EffectsPanelLabel.TextAlign = ContentAlignment.TopCenter;
            EffectsPanelLabel.Text      = "Effects Control";

            EpEffectClassChoose.Location   = new Point(10, 20);
            EpEffectClassChoose.Width      = (EffectsPanelLabel.Width - 30) / 2;
            EpEffectClassChoose.DataSource = Enum.GetValues(typeof(EffectClass));

            //
            //One frame settings
            EpOneFrameFuncChoose.Location   = new Point(EpEffectClassChoose.Right + 10, 20);
            EpOneFrameFuncChoose.Width      = EpEffectClassChoose.Width;
            EpOneFrameFuncChoose.DataSource = Enum.GetValues(typeof(Functions));

            MultiplierFromLabel.Location  = new Point(EpEffectClassChoose.Left, EpEffectClassChoose.Bottom + 10);
            MultiplierFromLabel.Size      = new Size(EffectsPanelLabel.Width - 20, 20);
            MultiplierFromLabel.Text      = "Multiplier from:";
            MultiplierFromLabel.TextAlign = ContentAlignment.MiddleLeft;

            MultiplierFromTextBox.Location  = new Point(EpEffectClassChoose.Width - 20, 0);
            MultiplierFromTextBox.Width     = EpEffectClassChoose.Width + 30;
            MultiplierFromTextBox.Text      = "0.0";
            MultiplierFromTextBox.BackColor = Color.White;

            MultiplierToLabel.Location  = new Point(EpEffectClassChoose.Left, MultiplierFromLabel.Bottom + 10);
            MultiplierToLabel.Size      = new Size(EffectsPanelLabel.Width - 20, 20);
            MultiplierToLabel.Text      = "Multiplier to:";
            MultiplierToLabel.TextAlign = ContentAlignment.MiddleLeft;

            MultiplierToTextBox.Location  = new Point(EpEffectClassChoose.Width - 20, 0);
            MultiplierToTextBox.Width     = EpEffectClassChoose.Width + 30;
            MultiplierToTextBox.Text      = "0.0";
            MultiplierToTextBox.BackColor = Color.White;

            //
            //Multi frame settings
            EpMultiFrameFuncChoose.Location   = new Point(EpEffectClassChoose.Right + 10, 20);
            EpMultiFrameFuncChoose.Width      = EpEffectClassChoose.Width;
            EpMultiFrameFuncChoose.DataSource = Enum.GetValues(typeof(MultiFrameFunctions));

            //
            //Start
            StartButton.Location = new Point(EffectsPanelLabel.Width - 70, EffectsPanelLabel.Height - 30);
            StartButton.Size     = new Size(60, 30);
            StartButton.Text     = "Start";
            StartButton.Enabled  = false;

            _renderWorker.WorkerReportsProgress = true;

            ShowRenderedCheckBox.Location = new Point(10, EffectsPanelLabel.Height - 27);
            ShowRenderedCheckBox.Text     = "Show rendered(slower)";
            ShowRenderedCheckBox.Checked  = ShowRendered;
            ShowRenderedCheckBox.Width    = 140;

            Controls.Add(EffectsPanelLabel);
            EffectsPanelLabel.Controls.Add(EpEffectClassChoose);
            EffectsPanelLabel.Controls.Add(EpOneFrameFuncChoose);
            EffectsPanelLabel.Controls.Add(MultiplierFromLabel);
            MultiplierFromLabel.Controls.Add(MultiplierFromTextBox);
            EffectsPanelLabel.Controls.Add(MultiplierToLabel);
            MultiplierToLabel.Controls.Add(MultiplierToTextBox);
            EffectsPanelLabel.Controls.Add(StartButton);
            EffectsPanelLabel.Controls.Add(ShowRenderedCheckBox);
            //effectsPanelLabel.Controls.Add(epMultiFrameFuncChoose);

            //
            //Handlers
            //
            //Top
            //
            OpenFileButton.Click += (sender, args) => { OpenFileButtonHandler(); };

            //
            //Left bottom subspace
            //
            TimeLine.ValueChanged += (sender, args) => { TimeLineHandler(); };

            //
            //Right subspace
            //
            EpEffectClassChoose.SelectionChangeCommitted += (sender, args) => { EpEffectClassChooseHandler(); };

            //
            //One frame settings
            EpOneFrameFuncChoose.SelectionChangeCommitted += (sender, args) =>
            {
                Function = (Functions)EpOneFrameFuncChoose.SelectedItem;
                Distorter.ResetMaxMinValues();
                if (StartButton.Enabled)
                {
                    DrawImage(PreviewPictureBox, Distorter.RunOneFrame(Reader, TimeLine.Value,
                                                                       MultiplierFrom, MultiplierTo, Function, PreviewPictureBox.Width, PreviewPictureBox.Height));
                }
            };
            MultiplierFromTextBox.TextChanged += (sender, args) => { MultiplierTextBoxHandler(MultiplierFromTextBox, ref MultiplierFrom); };
            MultiplierToTextBox.TextChanged   += (sender, args) => { MultiplierTextBoxHandler(MultiplierToTextBox, ref MultiplierTo); };

            //
            //Multi frame settings
            EpMultiFrameFuncChoose.SelectionChangeCommitted += (sender, args) =>
            {
                MFFunction = (MultiFrameFunctions)EpMultiFrameFuncChoose.SelectedItem;
            };

            //
            //Start
            ShowRenderedCheckBox.CheckedChanged += (sender, args) => { ShowRendered = ShowRenderedCheckBox.Checked; };
            _renderWorker.DoWork += (sender, args) =>
            {
                if (EffectClass == EffectClass.SingleFrame)
                {
                    OneFrameDistorter.Run(Reader, Writer, MultiplierFrom, MultiplierTo, Function, _renderWorker);
                }
                else if (EffectClass == EffectClass.MultiFrame)
                {
                    MultiFrameDistorter.Run(Reader, Writer, MFFunction, _renderWorker);
                }
            };
            _renderWorker.ProgressChanged += (sender, args) =>
            {
                if (ShowRendered)
                {
                    DrawImage(PreviewPictureBox, PreviewBitmap);
                }
                ProgressVisualBar.Value         = args.ProgressPercentage;
                ProgressPercent.Text            = $"Percent completed: {args.ProgressPercentage/10.0}%";
                var(timeRemaining, timeElapsed) = _progressTimer.GetTimeElapsed(args.ProgressPercentage);
                ProgressTimeRemaining.Text      = $"Time remaining: {timeRemaining:hh\\:mm\\:ss\\.ff}";
                ProgressTimeElapsed.Text        = $"Time elapsed: {timeElapsed:hh\\:mm\\:ss\\.ff}";
            };
            _renderWorker.RunWorkerCompleted += (sender, args) =>
            {
                Writer.Close();
                Writer.Dispose();
                Writer            = new VideoFileWriter();
                Writer.BitRate    = Reader.BitRate;   //конфигурируем writer
                Writer.VideoCodec = VideoCodec.Mpeg4; //Reader videoCodec
                Writer.FrameRate  = Reader.FrameRate;
                Writer.Height     = Reader.Height;
                Writer.Width      = Reader.Width;
                Writer.Open(GetNameToSave(VideoPath, VideoName, VideoExtension));
                OpenFileButton.Enabled         = true;
                EpEffectClassChoose.Enabled    = true;
                EpMultiFrameFuncChoose.Enabled = true;
                EpOneFrameFuncChoose.Enabled   = true;
                MultiplierFromTextBox.Enabled  = true;
                MultiplierToTextBox.Enabled    = true;
                ShowRenderedCheckBox.Enabled   = true;
                StartButton.Enabled            = true;
                _progressTimer.ResetAverageTime();
                ProgressVisualBar.Value    = 0;
                ProgressTimeRemaining.Text = "Time remaining: 00:00:00.00";
                ProgressTimeElapsed.Text   = "Time elapsed: 00:00:00.00";
                ProgressPercent.Text       = "Percent completed: 0%";
                Controls.Remove(ProgressLabel);
                Controls.Add(TimeLineLabel);
            };
            StartButton.Click += (sender, args) =>
            {
                OpenFileButton.Enabled         = false;
                EpEffectClassChoose.Enabled    = false;
                EpMultiFrameFuncChoose.Enabled = false;
                EpOneFrameFuncChoose.Enabled   = false;
                MultiplierFromTextBox.Enabled  = false;
                MultiplierToTextBox.Enabled    = false;
                ShowRenderedCheckBox.Enabled   = false;
                StartButton.Enabled            = false;
                Controls.Remove(TimeLineLabel);
                Controls.Add(ProgressLabel);
                _renderWorker.RunWorkerAsync();
            };
        }