TakePictureControl.cs 12.2 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WebCam;
using ImageFilters;
using System.IO;
using Touchless.Vision.Camera;
using MoyaAdminLib;
using System.Net;
using System.Collections.Specialized;
using System.Drawing.Imaging;
using System.Diagnostics;

namespace RamaSignup
{
    public partial class TakePictureControl : UserControl
    {
        //Image img;
        Pen RetanglePen = new Pen(Color.Blue);
        int RetangleHeight = 410;
        int RetangleWidth = 280;
        
        //bool freeze;
//        bool pictureTaken = false;
        bool cameraOpen = false;
        private CameraFrameSource _frameSource;
        private static Bitmap latestFrame;
        public event EventHandler Changed;

        public bool PictureTaken = false;

        public TakePictureControl()
        {
            InitializeComponent();
            //800,600
            //this.webcam = new WebCamera(this.Handle, 320, 240); // TODO viimeiseen kenttään conffista kameran numero
            //webcam.RecievedFrame += new WebCamera.RecievedFrameEventHandler(wc_RecievedFrame);
            RetangleHeight = pbIncoming.Size.Height;
            RetangleWidth = pbIncoming.Size.Width;

            

        }


        public void loadUserImage(User user)
        {
            PictureTaken = false;
            if (user.UserId == 0)
                return;
            string api = RestClient.GetRequestURL(Properties.Settings.Default.ApiURL, "v2/user/" + user.UserId + "/image");
            WebRequest request = WebRequest.Create(api);
            try
            {
                using (WebResponse response = request.GetResponse())
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        pbIncoming.Image = Bitmap.FromStream(stream);
                    }
                }

            }
            catch (Exception e)
            {
                //toolStripStatusLabel1.Text = e.Message;
                return;
            }

            Console.WriteLine(user.EventUserId);
        }
        private void getJpeg(Stream datastream)
        {
            EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 75L); //quality 75
            ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg");
            if (jpegCodec == null)
                return;
            EncoderParameters encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = qualityParam;
            latestFrame.Save(datastream, jpegCodec, encoderParams);
        }
        private ImageCodecInfo getEncoderInfo(string mimeType)
        {
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
            for (int i = 0; i < codecs.Length; i++)
                if (codecs[i].MimeType == mimeType)
                    return codecs[i];
            return null;
        }
        private string StreamToString(Stream responseStream)
        {
            StreamReader reader = new StreamReader(responseStream);
            string responseString = reader.ReadToEnd();
            responseStream.Close();
            reader.Close();
            return responseString;
        }
        public void SaveUserImage(User user)
        {
            if (PictureTaken == false) return;
            string url = RestClient.GetRequestURL(Properties.Settings.Default.ApiURL, "v2/user/" + user.UserId + "/image");
            NameValueCollection postParameters = new NameValueCollection();
            //postParameters.Add("password", Util.CreatePasswordHash(this.password));
            //postParameters.Add("crc", crc);
            //postParameters.Add("size", size);
            //postParameters.Add("filename", "image.jpg");
            //postParameters.Add("name", "image.jpg");

            string contentType = "image/jpeg";
            //string paramName = file;
            

            string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
            wr.ContentType = "multipart/form-data; boundary=" + boundary;
            wr.Method = "PUT";
            wr.KeepAlive = true;
            wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

            Stream rs = wr.GetRequestStream();

            string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            foreach (string key in postParameters.Keys)
            {
                rs.Write(boundarybytes, 0, boundarybytes.Length);
                string formitem = string.Format(formdataTemplate, key, postParameters[key]);
                byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                rs.Write(formitembytes, 0, formitembytes.Length);
            }
            rs.Write(boundarybytes, 0, boundarybytes.Length);

            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            //string header = string.Format(headerTemplate, paramName, "recording", contentType);
            string header = string.Format(headerTemplate, "image", "image.jpg", contentType);

            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            rs.Write(headerbytes, 0, headerbytes.Length);

            getJpeg(rs);

            byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            rs.Write(trailer, 0, trailer.Length);
            rs.Close();

            HttpWebResponse response = null;
            string responseValue = "";
            
            
            try
            {
                response = (HttpWebResponse)wr.GetResponse();
                // Read data if there is no exception tet
                responseValue = StreamToString(response.GetResponseStream());
                // deserialize it if still no exception
                Console.WriteLine(responseValue);
            }
            catch (Exception ex)
            {
                if (ex is WebException)
                {
                    //Debug.WriteLine("WebException occurred. Ex: " + ex.Message, Debug.DebugChain.ExeptionMessage);
                    Stream responseStream = ((WebException)ex).Response.GetResponseStream();

                    if (responseStream != null)
                    {
                        responseValue = StreamToString(responseStream);
                      //  Debug.WriteLine("Response was " + responseValue, Debug.DebugChain.Notify);
                    //    return serializer.Deserialize<RestError>(responseValue);
                        return;
                    }
                    //return new RestError("RestServerError");
                    return;
                }
                else
                {
                    //Debug.WriteLine("Exception at file upload" + ex.Message, Debug.DebugChain.ExeptionMessage);
                    //return new RestError("RestClientError");

                    return;
                }
            }
            finally
            {
                wr = null;
            }
            

        }


        private void startCapturing()
        {
            try
            {
                Camera c = null;
                if (Debugger.IsAttached)
                {
                    foreach (Camera cam in CameraService.AvailableCameras)
                    {
                        if (cam.Name.ToLower().Contains("mobius"))
                            c = cam;
                    }
                }
                if(c == null)
                    c = CameraService.AvailableCameras.First();
                setFrameSource(new CameraFrameSource(c));
                //_frameSource.Camera.CaptureWidth = 1024;
                //_frameSource.Camera.CaptureHeight = 768;

                _frameSource.Camera.CaptureWidth = 640;
                _frameSource.Camera.CaptureHeight = 480;

                _frameSource.Camera.Fps = 50;
                _frameSource.NewFrame += OnImageCaptured;

                pbIncoming.Paint += new PaintEventHandler(drawLatestImage);
               _frameSource.StartFrameCapture();
            }
            catch (Exception ex)
            {
                pbIncoming.Text = "Select A Camera";
                MessageBox.Show(ex.Message);
            }
        }
        private void drawLatestImage(object sender, PaintEventArgs e)
        {
            if (latestFrame != null)
            {
                // Draw the latest image from the active camera
                

                e.Graphics.DrawImage(latestFrame, 0, 0, latestFrame.Width, latestFrame.Height);
            }
        }
        private void thrashOldCamera()
        {
            // Trash the old camera
            if (_frameSource != null)
            {
                _frameSource.NewFrame -= OnImageCaptured;
                _frameSource.Camera.Dispose();
                setFrameSource(null);
                pbIncoming.Paint -= new PaintEventHandler(drawLatestImage);
            }
        }

        public void OnImageCaptured(Touchless.Vision.Contracts.IFrameSource frameSource, Touchless.Vision.Contracts.Frame frame, double fps)
        {
         

            latestFrame = BitmapFilter.Crop(frame.Image, RetangleWidth, RetangleHeight, ImageFilters.BitmapFilter.AnchorPosition.Free, 220, 220);
            //_latestFrame.RotateFlip(RotateFlipType.RotateNoneFlipY);
            

            this.pbIncoming.Invalidate();
            

            /*
            if (freeze)
            {
                this.pbIncoming.Refresh();
                return;
            }
            img = frame.Image;
            //img.RotateFlip(RotateFlipType.RotateNoneFlipY);
            this.pbIncoming.Image = BitmapFilter.Crop(img, RetangleWidth, RetangleHeight, ImageFilters.BitmapFilter.AnchorPosition.Free, 220, 220);*/
            
        }
        private void setFrameSource(CameraFrameSource cameraFrameSource)
        {
            if (_frameSource == cameraFrameSource)
                return;

            _frameSource = cameraFrameSource;
        }


        private void clear()
        {
            this.pbIncoming.Image = null;
            latestFrame = null;
            PictureTaken = false;

        }
        void savePicture(int pid)
        {


            MemoryStream imageStream = new MemoryStream();
            this.pbIncoming.Image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Png);
            imageStream.Position = 0;
            byte[] imageContent = new Byte[imageStream.Length];
            imageStream.Read(imageContent, 0, (int)imageStream.Length);
            //Objects.Pool.ExecNonQuery("UPDATE kortit SET kuva = :bytesData WHERE id=" + pid, new Npgsql.NpgsqlParameter(":bytesData", imageContent));
            return;
        }


        private void TakePictureControl_VisibleChanged(object sender, EventArgs e)
        {
            if (!this.Visible)
            {
                //if (webcam != null)
                  //  this.webcam.CloseWebcam();
            }

        }

        public void TakePicture()
        {
 
            PictureTaken = false;
            if (!cameraOpen)
            {
                btnTakePic.Enabled = false;
                cameraOpen = true;

                btnTakePic.Text = "Käytä tätä kuvaa";
                thrashOldCamera();
                startCapturing();
                btnTakePic.Enabled = true;
                PictureTaken = false;
            }
            else
            {
                btnTakePic.Enabled = false;
                cameraOpen = false;
                btnTakePic.Text = "Ota uusi kuva";
                thrashOldCamera();
                pbIncoming.Image = latestFrame;
                btnTakePic.Enabled = true;
                PictureTaken = true;
                if (Changed != null)
                    Changed(null, null);
            }
        }
        private void btnTakePic_Click_1(object sender, EventArgs e)
        {

            TakePicture();

        }
        

        internal void Clear()
        {
            pbIncoming.Image = null;
        }
    }

}