예제 #1
0
파일: PlayForm.cs 프로젝트: nbros/zcast
        private void PlayForm_Load(object sender, EventArgs e)
        {
            screencastData = ScreencastData.DeSerializeFrom(new FileStream(Path.Combine(Form1.SaveFolder, "zcast.xml"), FileMode.Open));
            screencastData.FrameInfos.Sort((x, y) => x.FrameNumber - y.FrameNumber);

            FormBorderStyle = FormBorderStyle.None;
            WindowState = FormWindowState.Maximized;
            //TopMost = true;

            Paint += new PaintEventHandler(PlayForm_Paint);

            Timer timer = new Timer();
            timer.Interval = screencastData.DelayBetweenFrames;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();

            reconstructed = new Bitmap(screencastData.Width, screencastData.Height, PixelFormat.Format32bppArgb);
            g = Graphics.FromImage(reconstructed);
        }
예제 #2
0
파일: Form1.cs 프로젝트: nbros/zcast
        private void btnCapture_Click(object sender, EventArgs e)
        {
            lock (btnCapture)
            {
                if (capturing)
                {
                    btnCapture.Text = "Start capturing";
                    stopCapture = true;
                    return;
                }

                btnCapture.Text = "Stop capture";
                capturing = true;
            }

            Stopwatch timer = new Stopwatch();
            Stopwatch timer2 = new Stopwatch();

            Bitmap bmpPrev = null;

            double last = Now();
            double betweenFrames = interval;

            timer.Start();
            ScreencastData screencastData = new ScreencastData();
            screencastData.Width = resX;
            screencastData.Height = resY;
            screencastData.DelayBetweenFrames = interval;

            //for (int i = 1; i <= nImages; i++)
            int frameNumber = 0;
            while(true)
            {
                if (stopCapture)
                {
                    stopCapture = false;
                    capturing = false;

                    timer.Stop();
                    label.Text = timer.Elapsed.Seconds + " s";

                    using (FileStream stream = new FileStream(Path.Combine(SaveFolder, "zcast.xml"), FileMode.Create))
                    {
                        screencastData.SerializeTo(stream);
                    }
                    return;
                }
                frameNumber++;

                IntPtr desktopWindow = NativeMethods.GetDesktopWindow();
                timer2.Reset();
                timer2.Start();
                Bitmap bmp = CaptureRectangle(desktopWindow, new Rectangle(0, 0, resX, resY));
                Debug.WriteLine("capture rectangle: " + timer2.ElapsedMilliseconds + "ms");
                //bmp.Save(@"C:\Users\Nicolas\Documents\test" + i + ".png");

                WaitCallback callBack = new WaitCallback(ComputeDiffJob);
                ThreadPool.QueueUserWorkItem(callBack, new ComputeDiffWork()
                {
                    BmpPrev = bmpPrev,
                    BmpCur = (Bitmap)bmp.Clone(),
                    FileName = "zcast" + frameNumber.ToString(),
                    ScreencastData = screencastData,
                    FrameNumber = frameNumber - 1,
                    EncodingQuality = (int)udQuality.Value
                });

                bmpPrev = bmp;
                label.Text = "" + frameNumber;
                Application.DoEvents();

                double now = Now();
                double nextFrameTime = last + betweenFrames;
                double remaining = nextFrameTime - now;
                if (remaining > 0)
                {
                    txtLog.AppendText("frame " + frameNumber + ": sleeping " + (remaining) + "ms\n");
                    while ((int)remaining > 1)
                    {
                        //txtLog.AppendText(Thread.CurrentThread.ManagedThreadId.ToString());
                        System.Threading.Thread.Sleep((int)remaining);
                        now = Now();
                        remaining = nextFrameTime - now;
                    }
                }
                else
                {
                    txtLog.AppendText(String.Format("Missed frame {0} by {1:f2}ms\n", frameNumber, -remaining));
                }
                last = now;
            }

            /*form.WindowState = FormWindowState.Maximized;
            form.FormBorderStyle = FormBorderStyle.None;
            form.TopMost = true;

            form.Paint += new PaintEventHandler(form_Paint);
            Bitmap reconstructed = new Bitmap(800, 600, PixelFormat.Format32bppArgb);
            Graphics g = Graphics.FromImage(reconstructed);
            for (int i = 1; i <= 1000; i++)
            {
                Bitmap bmp = new Bitmap(@"C:\Users\Nicolas\Documents\AAA\" + i + ".png");
                g.DrawImage(bmp, 0, 0, new Rectangle(0, 0, 800, 600), GraphicsUnit.Pixel);
                reconstructed.Save(@"C:\Users\Nicolas\Documents\AAA\reconstructed " + i + ".png");
                label.Text = "reconstructing: " + i;
                Application.DoEvents();
            }*/
        }