private void MakeCapture(Object locker, RPiCameraClient camera, ref bool started, ref bool looped, Button btnCameraCapture, Button btnCameraAutoCapture, NumericUpDown nudCameraRotation, NumericUpDown nudCameraXShift, NumericUpDown nudCameraYShift, PictureBox picCamera)
        {
            this.Invoke(new Action(() =>
            {
                btnCameraCapture.Enabled = false;

                btnCameraAutoCapture.Text    = "Auto capture (Enabled)";
                btnCameraAutoCapture.Enabled = true;
            }));

            started = true;

            while (looped)
            {
                Image image = null;

                lock (locker)
                    image = camera.Capture();

                if (image == null)
                {
                    break;
                }

                unsafe
                {
                    fixed(byte *pointer = image.Data)
                    {
                        int length = image.Height * image.Width * 3;

                        for (int i = 0; i < length; i += 3)
                        {
                            byte tmp = pointer[i];

                            pointer[i]     = pointer[i + 2];
                            pointer[i + 2] = tmp;
                        }

                        Bitmap source      = new Bitmap(image.Width, image.Height, image.Width * 3, PixelFormat.Format24bppRgb, new IntPtr(pointer));
                        Bitmap destination = new Bitmap(image.Width, image.Height);

                        int centerX = source.Width / 2;
                        int centerY = source.Height / 2;

                        using (Graphics g = Graphics.FromImage(destination))
                        {
                            g.Clear(Color.White);

                            float rotation = 0.0f;
                            float xShift   = 0.0f;
                            float yShift   = 0.0f;

                            this.Invoke(new Action(() =>
                            {
                                rotation = (float)nudCameraRotation.Value;
                                xShift   = (float)nudCameraXShift.Value;
                                yShift   = (float)nudCameraYShift.Value;
                            }));

                            GraphicsState state = g.Save();

                            g.TranslateTransform(centerX + xShift, centerY + yShift);
                            g.RotateTransform(rotation);
                            g.TranslateTransform(-centerX, -centerY);
                            g.DrawImage(source, 0.0f, 0.0f);

                            g.Restore(state);

                            g.DrawLine(Pens.Red, centerX, 0, centerX, source.Height);                            // pionowa
                            g.DrawLine(Pens.Red, 0, centerY, source.Width, centerY);                             // pozioma
                        }

                        this.Invoke(new Action(() =>
                        {
                            System.Drawing.Image tmp = picCamera.Image;

                            if (tmp != null)
                            {
                                tmp.Dispose();
                            }

                            picCamera.Image = destination;
                        }));
                    }
                }
            }

            this.Invoke(new Action(() =>
            {
                btnCameraCapture.Enabled = true;

                btnCameraAutoCapture.Text    = "Auto capture (Disabled)";
                btnCameraAutoCapture.Enabled = true;
            }));

            started = false;
        }
        private void CaptureCamera(RPiCameraClient camera, string side, NumericUpDown nudCameraRotation, NumericUpDown nudCameraXShift, NumericUpDown nudCameraYShift, PictureBox picCamera, DateTime now)
        {
            Image image = camera.Capture();

            if (image == null)
            {
                return;
            }

            unsafe
            {
                fixed(byte *pointer = image.Data)
                {
                    int length = image.Height * image.Width * 3;

                    for (int i = 0; i < length; i += 3)
                    {
                        byte tmp = pointer[i];

                        pointer[i]     = pointer[i + 2];
                        pointer[i + 2] = tmp;
                    }

                    Bitmap source      = new Bitmap(image.Width, image.Height, image.Width * 3, PixelFormat.Format24bppRgb, new IntPtr(pointer));
                    Bitmap destination = new Bitmap(image.Width, image.Height);

                    source.Save(now.Hour + "." + now.Minute + "." + now.Second + "." + now.Millisecond + "_" + side + "_camera_v1.png");

                    int centerX = source.Width / 2;
                    int centerY = source.Height / 2;

                    using (Graphics g = Graphics.FromImage(destination))
                    {
                        g.Clear(Color.White);

                        float rotation = 0.0f;
                        float xShift   = 0.0f;
                        float yShift   = 0.0f;

                        this.Invoke(new Action(() =>
                        {
                            rotation = (float)nudCameraRotation.Value;
                            xShift   = (float)nudCameraXShift.Value;
                            yShift   = (float)nudCameraYShift.Value;
                        }));

                        GraphicsState state = g.Save();

                        g.TranslateTransform(centerX + xShift, centerY + yShift);
                        g.RotateTransform(rotation);
                        g.TranslateTransform(-centerX, -centerY);
                        g.DrawImage(source, 0.0f, 0.0f);

                        g.Restore(state);

                        destination.Save(now.Hour + "." + now.Minute + "." + now.Second + "." + now.Millisecond + "_" + side + "_camera_v2.png");

                        g.DrawLine(Pens.Red, centerX, 0, centerX, source.Height);                        // pionowa
                        g.DrawLine(Pens.Red, 0, centerY, source.Width, centerY);                         // pozioma

                        destination.Save(now.Hour + "." + now.Minute + "." + now.Second + "." + now.Millisecond + "_" + side + "_camera_v3.png");
                    }

                    picCamera.Image = destination;
                }
            }
        }