Пример #1
0
        public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height)
        {
            if (surfaceHolder.Surface == null)
            {
                return;
            }
            try
            {
                cameraInstance.StopPreview();
                cameraInstance.SetPreviewDisplay(surfaceHolder);

                Android.Hardware.Camera.Parameters parameters  = cameraInstance.GetParameters();
                Android.Hardware.Camera.Size       optimalSize = CameraHelpers.GetOptimalPreviewSize(context, cameraInstance, width, height);
                parameters.SetPreviewSize(optimalSize.Width, optimalSize.Height);
                parameters.SetPictureSize(optimalSize.Width, optimalSize.Height);
                parameters.FocusMode = Android.Hardware.Camera.Parameters.FocusModeContinuousPicture;
                cameraInstance.SetParameters(parameters);
                cameraInstance.SetDisplayOrientation(CameraHelpers.GetCameraOrientation(context));
                cameraInstance.StartPreview();
            }
            catch (Exception e)
            {
                Log.Debug("Camera activity", "Error starting camera preview: " + e.Message);
            }
        }
Пример #2
0
        public static Android.Hardware.Camera.Size GetOptimalPictureSize(this Android.Hardware.Camera.Parameters p, int w)
        {
            var sizes  = p.SupportedPictureSizes;
            int offset = Integer.MaxValue;

            Android.Hardware.Camera.Size rs = null;

            if (sizes != null)
            {
                foreach (var size in sizes)
                {
                    if (size.Width >= size.Height)
                    {
                        int curSize = size.Width;

                        if (size.Height >= w && size.Height >= w && (curSize - w) < offset)
                        {
                            offset = curSize - w;
                            rs     = size;
                        }
                    }
                }
            }

            return(rs);
        }
Пример #3
0
        protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            var width  = ResolveSize(SuggestedMinimumWidth, widthMeasureSpec);
            var height = ResolveSize(SuggestedMinimumHeight, heightMeasureSpec);

            if (_mSupportedPreviewSizes != null)
            {
                _mPreviewSize = GetOptimalPreviewSize(_mSupportedPreviewSizes, width, height);
            }

            float ratio;

            if (_mPreviewSize.Height >= _mPreviewSize.Width)
            {
                ratio = _mPreviewSize.Height / (float)_mPreviewSize.Width;
            }
            else
            {
                ratio = _mPreviewSize.Width / (float)_mPreviewSize.Height;
            }

            // One of these methods should be used, second method squishes preview slightly
            SetMeasuredDimension(width, (int)(width * ratio));
            InitPictureSize();
        }
Пример #4
0
        private void UpdateCameraAspect()
        {
            try
            {
                Android.Hardware.Camera.Parameters camParams = camera.GetParameters();
                Android.Hardware.Camera.CameraInfo info      = new Android.Hardware.Camera.CameraInfo();
                Android.Hardware.Camera.GetCameraInfo((int)Android.Hardware.CameraFacing.Back, info);

                Android.Hardware.Camera.Size size = GetOptimalPreviewSize(camParams.SupportedPreviewSizes, width, height);

                camParams.SetPreviewSize(size.Width, size.Height);

                int rotation = (info.Orientation + 360) % 360;

                camParams.SetRotation(rotation);

                if (camParams.SupportedFocusModes.Contains(Android.Hardware.Camera.Parameters.FocusModeContinuousPicture))
                {
                    camParams.FocusMode = Android.Hardware.Camera.Parameters.FocusModeContinuousPicture;
                }

                camera.SetParameters(camParams);
            }
            catch (System.Exception e)
            {
                System.Console.WriteLine(e.Message);
            }
        }
Пример #5
0
 public void setResolution(Size resolution)
 {
     DisconnectCamera();
     MMaxHeight = (int)resolution.Height;
     MMaxWidth  = (int)resolution.Width;
     ConnectCamera(Width, Height);
 }
Пример #6
0
        private Android.Hardware.Camera.Size getOptimalSize(int width, int height, List <Android.Hardware.Camera.Size> sizes)
        {
            Android.Hardware.Camera.Size pictureSize = sizes[0];

            List <Android.Hardware.Camera.Size> candidates = new List <Android.Hardware.Camera.Size>();

            foreach (Android.Hardware.Camera.Size size in sizes)
            {
                if (size.Width >= width && size.Height >= height && size.Width * height == size.Height * width)
                {
                    // 比例相同
                    candidates.Add(size);
                }
                else if (size.Height >= width && size.Width >= height && size.Width * width == size.Height * height)
                {
                    // 反比例
                    candidates.Add(size);
                }
            }

            //if (candidates != null)
            //{
            //    return Collections.Min(candidates, sizeComparator);
            //}

            foreach (Android.Hardware.Camera.Size size in sizes)
            {
                if (size.Width >= width && size.Height >= height)
                {
                    return(size);
                }
            }

            return(pictureSize);
        }
Пример #7
0
        private Android.Hardware.Camera.Size GetOptimalPreviewSize(IList <Android.Hardware.Camera.Size> sizes, int w, int h)
        {
            const double ASPECT_TOLERANCE = 0.05;
            double       targetRatio      = (double)w / h;
            int          maxSize          = 1228800 * 2;

            if (sizes == null)
            {
                return(null);
            }

            Android.Hardware.Camera.Size optimalSize = null;
            double minDiff = System.Double.MaxValue;

            int targetHeight = h;

            // Try to find an size match aspect ratio and size
            foreach (Android.Hardware.Camera.Size size in sizes)
            {
                double ratio = (double)size.Height / size.Width;

                if (size.Height * size.Width > maxSize)
                {
                    continue;
                }

                if (System.Math.Abs(ratio - targetRatio) > ASPECT_TOLERANCE)
                {
                    continue;
                }

                if (System.Math.Abs(size.Height - targetHeight) < minDiff)
                {
                    optimalSize = size;
                    minDiff     = System.Math.Abs(size.Height - targetHeight);
                }
            }

            // Cannot find the one match the aspect ratio, ignore the requirement
            if (optimalSize == null)
            {
                minDiff = System.Double.MaxValue;
                foreach (Android.Hardware.Camera.Size size in sizes)
                {
                    if (size.Height * size.Width > maxSize)
                    {
                        continue;
                    }

                    if (System.Math.Abs(size.Height - targetHeight) < minDiff)
                    {
                        optimalSize = size;
                        minDiff     = System.Math.Abs(size.Height - targetHeight);
                    }
                }
            }
            return(optimalSize);
        }
Пример #8
0
        internal Android.Hardware.Camera.Size GetOptimalPreviewSize(IList <Android.Hardware.Camera.Size> sizes)
        {
            const double ASPECT_TOLERANCE = 0.05;
            string       TAG = "GetOptimalPreviewSize";

            if (sizes == null)
            {
                return(null);
            }

            Android.Hardware.Camera.Size optimalSize = null;
            double minDiff      = System.Double.MaxValue;
            Point  display_size = new Point();
            //AppCompatActivity activity = (AppCompatActivity)this.BaseContext;
            {
                Display display = this.WindowManager.DefaultDisplay;
                display.GetSize(display_size);

                Log.Debug(TAG, "display_size: " + display_size.X + " x " + display_size.Y);
            }
            double targetRatio  = CalculateTargetRatioForPreview(display_size);
            int    targetHeight = System.Math.Min(display_size.Y, display_size.X);

            if (targetHeight <= 0)
            {
                targetHeight = display_size.Y;
            }
            // Try to find the size which matches the aspect ratio, and is closest match to display height
            foreach (Android.Hardware.Camera.Size size in sizes)
            {
                Log.Debug(TAG, "    supported preview size: " + size.Width + ", " + size.Height);
                double ratio = (double)size.Width / size.Height;
                if (System.Math.Abs(ratio - targetRatio) > ASPECT_TOLERANCE)
                {
                    continue;
                }
                if (System.Math.Abs(size.Height - targetHeight) < minDiff)
                {
                    optimalSize = size;
                    minDiff     = System.Math.Abs(size.Height - targetHeight);
                }
            }
            if (optimalSize == null)
            {
                // can't find match for aspect ratio, so find closest one
                Log.Debug(TAG, "no preview size matches the aspect ratio");
                optimalSize = GetClosestSize(sizes, targetRatio);
            }
            optimalSize = sizes[1];

            Log.Debug(TAG, "chose optimalSize: " + optimalSize.Width + " x " + optimalSize.Height);
            Log.Debug(TAG, "optimalSize ratio: " + ((double)optimalSize.Width / optimalSize.Height));
            return(optimalSize);
        }
Пример #9
0
        internal Android.Hardware.Camera.Size GetOptimalPreviewSizeNotinUse(IList <Android.Hardware.Camera.Size> sizes, int w, int h)
        {
            double ASPECT_TOLERANCE = 0.1;
            double targetRatio      = (double)h / w;

            if (Resources.Configuration.Orientation == Android.Content.Res.Orientation.Portrait)
            {
                targetRatio = (double)h / (double)w;
            }
            else if (Resources.Configuration.Orientation == Android.Content.Res.Orientation.Landscape)
            {
                targetRatio = (double)w / (double)h;
            }

            if (sizes == null)
            {
                return(null);
            }

            Android.Hardware.Camera.Size optimalSize = null;
            double minDiff = System.Double.MaxValue;

            int targetHeight = h;

            foreach (Android.Hardware.Camera.Size size in sizes)
            {
                double ratio = (double)size.Height / size.Width;
                if (Java.Lang.Math.Abs(ratio - targetRatio) > ASPECT_TOLERANCE)
                {
                    continue;
                }

                if (Java.Lang.Math.Abs(size.Height - targetHeight) < minDiff)
                {
                    optimalSize = size;
                    minDiff     = Java.Lang.Math.Abs(size.Height - targetHeight);
                }
            }
            if (optimalSize == null)
            {
                minDiff = Java.Lang.Double.MaxValue;
                foreach (Android.Hardware.Camera.Size size in sizes)
                {
                    //Console.WriteLine("FIXED HEIGHT:"+size.Height+" WIDTH:"+size.Width);
                    if (Java.Lang.Math.Abs(size.Height - targetHeight) < minDiff)
                    {
                        optimalSize = size;
                        minDiff     = Java.Lang.Math.Abs(size.Height - targetHeight);
                    }
                }
            }
            return(optimalSize);
        }
Пример #10
0
        private Android.Hardware.Camera.Parameters GetCameraParams(Android.Hardware.Camera camera)
        {
            var paramsCamera = camera.GetParameters();
            IList <Android.Hardware.Camera.Size> supportedSizes =
                paramsCamera.SupportedPictureSizes;

            Android.Hardware.Camera.Size sizePicture =
                supportedSizes[supportedSizes.Count / 2];
            paramsCamera.Set("orientation", "landscape");
            paramsCamera.Set("rotation", 90);
            paramsCamera.SetPictureSize(sizePicture.Width, sizePicture.Height);
            return(paramsCamera);
        }
Пример #11
0
        public Android.Hardware.Camera.Size GetClosestSize(IList <Android.Hardware.Camera.Size> sizes, double targetRatio)
        {
            Log.Debug("GetClosestSize", "getClosestSize()");
            Android.Hardware.Camera.Size optimalSize = null;
            double minDiff = System.Double.MaxValue;

            foreach (Android.Hardware.Camera.Size size in sizes)
            {
                double ratio = (double)size.Width / size.Height;
                if (System.Math.Abs(ratio - targetRatio) < minDiff)
                {
                    optimalSize = size;
                    minDiff     = System.Math.Abs(ratio - targetRatio);
                }
            }
            return(optimalSize);
        }
Пример #12
0
        private Android.Hardware.Camera.Size GetOptimalPreviewSize(List <Android.Hardware.Camera.Size> sizes, int w, int h)
        {
            var aspectTolerance = 0.1;
            var targetRatio     = (double)h / w;

            if (sizes == null)
            {
                return(null);
            }

            Android.Hardware.Camera.Size optimalSize = null;
            var minDiff = double.MaxValue;

            var targetHeight = h;

            foreach (var size in sizes)
            {
                var ratio = (double)size.Height / size.Width;
                if (Math.Abs(ratio - targetRatio) > aspectTolerance)
                {
                    continue;
                }

                if (Math.Abs(size.Height - targetHeight) < minDiff)
                {
                    optimalSize = size;
                    minDiff     = Math.Abs(size.Height - targetHeight);
                }
            }

            if (optimalSize == null)
            {
                minDiff = double.MaxValue;
                foreach (var size in sizes)
                {
                    if (Math.Abs(size.Height - targetHeight) < minDiff)
                    {
                        optimalSize = size;
                        minDiff     = Math.Abs(size.Height - targetHeight);
                    }
                }
            }

            return(optimalSize);
        }
Пример #13
0
 public static Bitmap convertYuvByteArrayToBitmap(byte[] data, Android.Hardware.Camera camera)
 {
     try
     {
         Android.Hardware.Camera.Parameters parameters = camera.GetParameters();
         Android.Hardware.Camera.Size       size       = parameters.PreviewSize;
         YuvImage image = new YuvImage(data, parameters.PreviewFormat, size.Width, size.Height, null);
         System.IO.MemoryStream out_ = new System.IO.MemoryStream();
         image.CompressToJpeg(new Rect(0, 0, size.Width, size.Height), int.Parse(MainValues.quality), out_);
         byte[] imageBytes = out_.ToArray();
         out_.Flush(); out_.Close(); out_.Dispose();
         return(BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length));
     }
     catch (Exception)
     {
         return(null);
     }
 }
Пример #14
0
        protected Android.Hardware.Camera.Size determineBestSize(IList <Android.Hardware.Camera.Size> sizes, int widthThreshold)
        {
            Android.Hardware.Camera.Size bestSize = null;

            foreach (Android.Hardware.Camera.Size currentSize in sizes)
            {
                var isDesiredRatio = currentSize.Width / 4 == currentSize.Height / 3;
                var isBetterSize   = bestSize == null || currentSize.Width > bestSize.Width;
                var isInBounds     = currentSize.Width <= PICTURE_SIZE_MAX_WIDTH;

                if (isDesiredRatio && isInBounds && isBetterSize)
                {
                    bestSize = currentSize;
                }
            }

            return(bestSize ?? sizes.First());
        }
Пример #15
0
        public void SurfaceCreated(ISurfaceHolder holder)
        {
            // TODO Auto-generated method stub
            try
            {
                camera = Android.Hardware.Camera.Open();
                Android.Hardware.Camera.Parameters param = camera.GetParameters();

                // Check what resolutions are supported by your camera
                IList <Android.Hardware.Camera.Size> sizes = param.SupportedPictureSizes;

                // setting small image size in order to avoid OOM error
                Android.Hardware.Camera.Size cameraSize = null;
                foreach (Android.Hardware.Camera.Size size in sizes)
                {
                    //set whatever size you need
                    //if(size.height<500) {
                    cameraSize = size;
                    break;
                    //}
                }

                if (cameraSize != null)
                {
                    param.SetPictureSize(cameraSize.Width, cameraSize.Height);
                    camera.SetParameters(param);

                    float ratio = relativeLayout.Height * 1f / cameraSize.Height;
                    float w     = cameraSize.Width * ratio;
                    float h     = cameraSize.Height * ratio;
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams((int)w, (int)h);
                    cameraSurfaceView.LayoutParameters = (lp);
                }
            }
            catch (RuntimeException e)
            {
                Toast.MakeText(
                    ApplicationContext,
                    "Device camera  is not working properly, please try after sometime.",
                    ToastLength.Long).Show();
            }
        }
Пример #16
0
 private Bitmap convertYuvByteArrayToBitmap(byte[] data, Android.Hardware.Camera camera)
 {
     try
     {
         Android.Hardware.Camera.Parameters parameters = camera.GetParameters();
         Android.Hardware.Camera.Size       size       = parameters.PreviewSize;
         using (YuvImage image = new YuvImage(data, parameters.PreviewFormat, size.Width, size.Height, null))
         {
             using (MemoryStream memoryStream = new MemoryStream())
             {
                 image.CompressToJpeg(new Rect(0, 0, size.Width, size.Height), int.Parse(MainValues.quality), memoryStream);
                 return(BitmapFactory.DecodeByteArray(memoryStream.ToArray(), 0, memoryStream.ToArray().Length));
             }
         }
     }
     catch (Exception)
     {
         return(null);
     }
 }
Пример #17
0
        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            Log.Info(TAG, "called onOptionsItemSelected; selected item: " + item);
            if (item.GroupId == 1)
            {
                mOpenCvCameraView.setEffect((string)item.TitleFormatted.ToString());
                Toast.MakeText(this, mOpenCvCameraView.getEffect(), ToastLength.Short).Show();
            }
            else if (item.GroupId == 2)
            {
                int  id         = item.ItemId;
                Size resolution = mResolutionList[id];
                mOpenCvCameraView.setResolution(resolution);
                resolution = mOpenCvCameraView.getResolution();
                string caption = resolution.Width.ToString() + "x" + resolution.Height.ToString();
                Toast.MakeText(this, caption, ToastLength.Short).Show();
            }

            return(true);
        }
Пример #18
0
 private void opPreviewSize(int width, int height)
 {
     if (camera != null && width > 0)
     {
         try
         {
             Android.Hardware.Camera.Parameters parameters = camera.GetParameters();
             Android.Hardware.Camera.Size       optSize    = getOptimalSize(width, height, new List <Android.Hardware.Camera.Size>(camera.GetParameters().SupportedPreviewSizes));
             Log.Info("wtf", "opPreviewSize-> " + optSize.Width + " " + optSize.Height);
             parameters.SetPreviewSize(optSize.Width, optSize.Height);
             // parameters.setPreviewFpsRange(10, 15);
             camera.SetParameters(parameters);
             camera.StartPreview();
         }
         catch (RuntimeException e)
         {
             e.PrintStackTrace();
         }
     }
 }
Пример #19
0
        public static Android.Hardware.Camera.Size GetPictureSize(this Android.Hardware.Camera.Parameters p, int w)
        {
            var sizes  = p.SupportedPictureSizes;
            var sizes2 = p.SupportedPreviewSizes;
            var offset = Integer.MaxValue;

            Android.Hardware.Camera.Size rs = null;

            if (sizes != null)
            {
                foreach (var size in sizes)
                {
                    foreach (var size2 in sizes2)
                    {
                        if (size.Width == size2.Width && size.Height == size2.Height)
                        {
                            int curSize = 0;

                            if (size.Width > size.Height)
                            {
                                curSize = size.Width;
                            }
                            else
                            {
                                curSize = size.Height;
                            }

                            if (size.Width >= w && size.Height >= w && (curSize - w) < offset)
                            {
                                offset = curSize - w;
                                rs     = size;
                            }
                        }
                    }
                }
            }

            return(rs);
        }
Пример #20
0
        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            IList <string> effects = mOpenCvCameraView.getEffectList();

            if (effects == null)
            {
                Log.Error(TAG, "Color effects are not supported by device!");
                return(true);
            }

            mColorEffectsMenu = menu.AddSubMenu("Color Effect");
            mEffectMenuItems  = new IMenuItem[effects.Count];

            int idx = 0;

            foreach (var item in effects)
            {
                string element = item;
                mEffectMenuItems[idx] = mColorEffectsMenu.Add(1, idx, Menu.None, element);
                idx++;
            }

            mResolutionMenu      = menu.AddSubMenu("Resolution");
            mResolutionList      = mOpenCvCameraView.getResolutionList();
            mResolutionMenuItems = new IMenuItem[mResolutionList.Count];


            idx = 0;
            foreach (var item in mResolutionList)
            {
                Size element = item;
                mResolutionMenuItems[idx] = mResolutionMenu.Add(2, idx, Menu.None,
                                                                element.Width.ToString() + "x" + element.Height.ToString());
                idx++;
            }

            return(true);
        }
Пример #21
0
        public static Android.Hardware.Camera.Size GetOptimalPreviewSize(this Android.Hardware.Camera.Parameters p,
                                                                         Android.Hardware.Camera.Size pictureSize)
        {
            var   sizes        = p.SupportedPreviewSizes;
            float pictureRatio = pictureSize.Width / pictureSize.Height;
            int   offset       = Integer.MaxValue;

            Android.Hardware.Camera.Size rs = null;

            if (sizes != null)
            {
                foreach (var size in sizes)
                {
                    float tempRatio = size.Width / size.Height;

                    if (tempRatio == pictureRatio)
                    {
                        if (rs == null)
                        {
                            rs = size;
                        }
                        else
                        {
                            int tempOffset = Math.Abs(size.Width - pictureSize.Height);

                            if (tempOffset < offset)
                            {
                                offset = tempOffset;
                                rs     = size;
                            }
                        }
                    }
                }
            }

            return(rs);
        }
Пример #22
0
        public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height)
        {
            // TODO Auto-generated method stub

            if (previewing)
            {
                camera.StopPreview();
                previewing = false;
            }
            try
            {
                float w = 0;
                float h = 0;

                if (this.Resources.Configuration.Orientation != Android.Content.Res.Orientation.Landscape)
                {
                    camera.SetDisplayOrientation(90);
                    Android.Hardware.Camera.Size cameraSize = camera.GetParameters().PictureSize;
                    int   wr    = relativeLayout.Width;
                    int   hr    = relativeLayout.Height;
                    float ratio = relativeLayout.Width * 1f / cameraSize.Height;
                    w = cameraSize.Width * ratio;
                    h = cameraSize.Height * ratio;
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams((int)h, (int)w);
                    cameraSurfaceView.LayoutParameters = (lp);
                    frameImageView.LayoutParameters    = lp;
                }
                else
                {
                    camera.SetDisplayOrientation(0);
                    Android.Hardware.Camera.Size cameraSize = camera.GetParameters().PictureSize;
                    float ratio = relativeLayout.Height * 1f / cameraSize.Height;
                    w = cameraSize.Width * ratio;
                    h = cameraSize.Height * ratio;
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams((int)w, (int)h);
                    cameraSurfaceView.LayoutParameters = (lp);
                    frameImageView.LayoutParameters    = lp;
                }

                camera.SetPreviewDisplay(cameraSurfaceHolder);
                camera.StartPreview();
                previewing = true;
                //float imgHeight = frameImageView.Height;
                //float imgeWidth = frameImageView.Width;

                float imgeWidth = frameImageView.Drawable.IntrinsicWidth;
                float imgHeight = frameImageView.Drawable.IntrinsicHeight;

                DisplayMetrics displayMetrics = new DisplayMetrics();
                WindowManager.DefaultDisplay.GetMetrics(displayMetrics);
                int widthS = displayMetrics.WidthPixels;

                float hR = h / imgHeight;
                float wR = w / widthS;
                //framMatrix.SetScale(2*wR,2*hR);
                frameImageView.SetScaleType(ImageView.ScaleType.FitXy);
            }
            catch (System.Exception e)
            {
                // TODO Auto-generated catch block
                System.Console.WriteLine("SurfaceChanged:" + e.ToString());
            }
        }
Пример #23
0
        protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            int width  = ResolveSize(SuggestedMinimumWidth, widthMeasureSpec);
            int height = ResolveSize(SuggestedMinimumHeight, heightMeasureSpec);

            if (mSupportedPreviewSizes != null)
            {
                mPreviewSize = _Context.GetOptimalPreviewSize(mSupportedPreviewSizes);
            }

            float ratio;

            if (mPreviewSize.Height >= mPreviewSize.Width)
            {
                ratio = (float)mPreviewSize.Height / (float)mPreviewSize.Width;
            }
            else
            {
                ratio = (float)mPreviewSize.Width / (float)mPreviewSize.Height;
            }

            // One of these methods should be used, second method squishes preview slightly
            SetMeasuredDimension(width, (int)(width * ratio));

            return;

            // We purposely disregard child measurements because act as a
            // wrapper to a SurfaceView that centers the camera preview instead
            // of stretching it.
            //int width = ResolveSize(SuggestedMinimumWidth, widthMeasureSpec);
            //int height = ResolveSize(SuggestedMinimumHeight, heightMeasureSpec);
            //SetMeasuredDimension(width, height);

            //if (mSupportedPreviewSizes != null)
            //{
            //    mPreviewSize = GetOptimalPreviewSize(mSupportedPreviewSizes, width, height);
            //}

            //int width = ResolveSize(SuggestedMinimumWidth, widthMeasureSpec);
            //int height = ResolveSize(SuggestedMinimumHeight, heightMeasureSpec);
            //SetMeasuredDimension(width, height);

            //if (mSupportedPreviewSizes != null)
            //{
            //    mPreviewSize = GetOptimalPreviewSize(mSupportedPreviewSizes, width, height);
            //}
            mPreviewSize = _Context.GetOptimalPreviewSize(mSupportedPreviewSizes);
            if (mPreviewSize != null)
            {
                SetMeasuredDimension(width, height);
                //float ratio;
                //if (mPreviewSize.Height >= mPreviewSize.Width)
                //    ratio = (float)mPreviewSize.Height / (float)mPreviewSize.Width;
                //else
                //    ratio = (float)mPreviewSize.Width / (float)mPreviewSize.Height;

                //// One of these methods should be used, second method squishes preview slightly
                ////SetMeasuredDimension(width, (int)(width * ratio));
                ////        setMeasuredDimension((int) (width * ratio), height);
                //float camHeight = (int)(width * ratio);
                //float newCamHeight;
                //float newHeightRatio;

                //if (camHeight < height)
                //{
                //    newHeightRatio = (float)height / (float)mPreviewSize.Height;
                //    newCamHeight = (newHeightRatio * camHeight);
                //    System.Console.WriteLine(camHeight + " " + height + " " + mPreviewSize.Height + " " + newHeightRatio + " " + newCamHeight);
                //    SetMeasuredDimension((int)(width * newHeightRatio), (int)newCamHeight);
                //    //System.Console.WriteLine(mPreviewSize.Width + " | " + mPreviewSize.Height + " | ratio - " + ratio + " | H_ratio - " + newHeightRatio + " | A_width - " + (width * newHeightRatio) + " | A_height - " + newCamHeight);
                //    //mPreviewSize.Width = (int)(width * newHeightRatio);
                //    //mPreviewSize.Height = (int)newCamHeight;
                //}
                //else
                //{
                //    newCamHeight = camHeight;
                //    SetMeasuredDimension(width, (int)newCamHeight);
                //    //System.Console.WriteLine(mPreviewSize.Width + " | " + mPreviewSize.Height + " | ratio - " + ratio + " | A_width - " + (width) + " | A_height - " + newCamHeight);
                //    //mPreviewSize.Width = width;
                //    //mPreviewSize.Height = (int)newCamHeight;
                //}
            }
        }
        private void InitLeadCam()
        {
            if (leadCamera.Camera == null)
            {
                _cameraObjectNotReady = true;
                return;
            }

            if (!cleanup || AppResumed)
            {
                leadCamera.Camera.Start();
                //reset the clean up flag
                cleanup    = true;
                AppResumed = false;

                leadCamera.RotationChanged += LeadCamera_RotationChanged;
                leadCamera.PictureReceived += LeadCamera_PictureReceived;


                if (_enableAutoCapture)
                {
                    leadCamera.FrameReceived += LeadCamera_FrameReceived;
                }

                return;
            }

            if (_enableAutoCapture)
            {
                Animation labelFadeAnimation = new Animation();

                Animation fadeOutAnimation = new Animation
                                             (
                    callback: d => autoCaptureLabel.Opacity = d,
                    start: 1,
                    end: 0.25,
                    easing: Easing.SinInOut
                                             );

                Animation fadeInAnimation = new Animation
                                            (
                    callback: e =>
                {
                    autoCaptureLabel.Opacity = e;
                },
                    start: 0.25,
                    end: 1,
                    easing: Easing.SinInOut
                                            );

                labelFadeAnimation.Add(0, 0.5, fadeOutAnimation);
                labelFadeAnimation.Add(0.5, 1, fadeInAnimation);

                autoCaptureLabel.Animate("FadeInOut", labelFadeAnimation, length: 1000, easing: Easing.SinInOut, repeat: () => true);
                UpdateCardDetectionStatus();
            }

            leadCamera.RotationChanged += LeadCamera_RotationChanged;
            leadCamera.PictureReceived += LeadCamera_PictureReceived;

            leadCamera.CameraOptions.AutoRotateImage = _autoRotateImage;
            leadCamera.Camera.FocusMode = FocusMode.Continuous;
#if __IOS__
            var ioscam = leadCamera.Camera.NativeCamera as AVFoundation.AVCaptureSession;
            if (ioscam != null)
            {
                var presetValue = ioscam.SessionPreset;
                if (HomePage.CurrentAppData.CameraQuality == Utils.CameraQuality.Medium)
                {
                    presetValue = new Foundation.NSString("AVCaptureSessionPreset1920x1080");
                }
                else
                {
                    presetValue = new Foundation.NSString("AVCaptureSessionPreset3840x2160");
                }

                try
                {
                    foreach (AVFoundation.AVCaptureOutput output in ioscam.Outputs)
                    {
                        if (output is AVFoundation.AVCaptureStillImageOutput stillImageOutput)
                        {
                            stillImageOutput.HighResolutionStillImageOutputEnabled = (HomePage.CurrentAppData.CameraQuality == Utils.CameraQuality.High) ? true : false;
                        }
                    }
                    ioscam.SessionPreset = presetValue;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
#else
            //set capture quality setting
#pragma warning disable CS0618 // Type or member is obsolete
            var droidcam     = leadCamera.Camera.NativeCamera as Android.Hardware.Camera;
            var parameters   = droidcam.GetParameters();
            var pictureSizes = parameters.SupportedPictureSizes;
            if (pictureSizes != null)
            {
                Android.Hardware.Camera.Size closestMatch = null;
                if (HomePage.CurrentAppData.CameraQuality == Utils.CameraQuality.Medium)
                {
                    // Get the first camera size with width bigger than 2000
                    var closestMatches = pictureSizes.OrderByDescending(x => x.Width).Where(x => x.Width > 2000);
                    if (closestMatches != null && closestMatches.Count() > 0)
                    {
                        closestMatch = closestMatches.Last();
                    }
                }
                else
                {
                    var closestMatches = pictureSizes.OrderByDescending(x => x.Width).Where(x => x.Width > 3800);
                    if (closestMatches != null && closestMatches.Count() > 0)
                    {
                        closestMatch = closestMatches.Last();
                    }
                }

                if (closestMatch == null)
                {
                    closestMatch = pictureSizes.OrderByDescending(x => x.Height).First();
                }

                parameters.SetPictureSize(closestMatch.Width, closestMatch.Height);
                droidcam.SetParameters(parameters);
            }
#pragma warning restore CS0618 // Type or member is obsolete
#endif

            autoCaptureGrid.IsVisible = _enableAutoCapture;
            if (_enableAutoCapture)
            {
                leadCamera.FrameReceived += LeadCamera_FrameReceived;
            }
        }
Пример #25
0
        private void configureCameraAndStartPreview(Android.Hardware.Camera camera)
        {
            // Setting camera parameters when preview is running can cause crashes on some android devices
            stopPreview();

            // Configure camera orientation. This is needed for both correct preview orientation
            // and recognition
            orientation = getCameraOrientation();
            camera.SetDisplayOrientation(orientation);

            // Configure camera parameters
            Android.Hardware.Camera.Parameters parameters = camera.GetParameters();

            // Select preview size. The preferred size for Text Capture scenario is 1080x720. In some scenarios you might
            // consider using higher resolution (small text, complex background) or lower resolution (better performance, less noise)
            cameraPreviewSize = null;
            foreach (Android.Hardware.Camera.Size size in parameters.SupportedPreviewSizes)
            {
                if (size.Height <= 720 || size.Width <= 720)
                {
                    if (cameraPreviewSize == null)
                    {
                        cameraPreviewSize = size;
                    }
                    else
                    {
                        int resultArea = cameraPreviewSize.Width * cameraPreviewSize.Height;
                        int newArea    = size.Width * size.Height;
                        if (newArea > resultArea)
                        {
                            cameraPreviewSize = size;
                        }
                    }
                }
            }
            parameters.SetPreviewSize(cameraPreviewSize.Width, cameraPreviewSize.Height);

            // Zoom
            parameters.Zoom = cameraZoom;
            // Buffer format. The only currently supported format is NV21
            parameters.PreviewFormat = Android.Graphics.ImageFormatType.Nv21;
            // Default focus mode
            parameters.FocusMode = Android.Hardware.Camera.Parameters.FocusModeAuto;

            // Done
            camera.SetParameters(parameters);

            // The camera will fill the buffers with image data and notify us through the callback.
            // The buffers will be sent to camera on requests from recognition service (see implementation
            // of ITextCaptureService.Callback.onRequestLatestFrame above)
            camera.SetPreviewCallbackWithBuffer(cameraPreviewCallback);

            // Clear the previous recognition results if any
            clearRecognitionResults();

            // Width and height of the preview according to the current screen rotation
            int width  = 0;
            int height = 0;

            switch (orientation)
            {
            case 0:
            case 180:
                width  = cameraPreviewSize.Width;
                height = cameraPreviewSize.Height;
                break;

            case 90:
            case 270:
                width  = cameraPreviewSize.Height;
                height = cameraPreviewSize.Width;
                break;
            }

            // Configure the view scale and area of interest (camera sees it as rotated 90 degrees, so
            // there's some confusion with what is width and what is height)
            surfaceViewWithOverlay.setScaleX(surfaceViewWithOverlay.Width, width);
            surfaceViewWithOverlay.setScaleY(surfaceViewWithOverlay.Height, height);
            // Area of interest
            int marginWidth  = (areaOfInterestMargin_PercentOfWidth * width) / 100;
            int marginHeight = (areaOfInterestMargin_PercentOfHeight * height) / 100;

            surfaceViewWithOverlay.setAreaOfInterest(
                new Rect(marginWidth, marginHeight, width - marginWidth,
                         height - marginHeight));

            // Start preview
            camera.StartPreview();

            setCameraFocusMode(Android.Hardware.Camera.Parameters.FocusModeAuto);
            autoFocus(finishCameraInitialisationAutoFocusCallback);

            inPreview = true;
        }
Пример #26
0
        public void OnPictureTaken(byte[] data, Android.Hardware.Camera camera)
        {
            // TODO Auto-generated method stub
            BitmapFactory.Options options = new BitmapFactory.Options();
            //o.inJustDecodeBounds = true;
            Bitmap cameraBitmapNull = BitmapFactory.DecodeByteArray(data, 0, data.Length, options);

            int    wid = options.OutWidth;
            int    hgt = options.OutHeight;
            Matrix nm  = new Matrix();

            Android.Hardware.Camera.Size cameraSize = camera.GetParameters().PictureSize;
            float ratio = relativeLayout.Height * 1f / cameraSize.Height;

            if (Resources.Configuration.Orientation != Android.Content.Res.Orientation.Landscape)
            {
                nm.PostRotate(90);
                nm.PostTranslate(hgt, 0);
                wid   = options.OutHeight;
                hgt   = options.OutWidth;
                ratio = relativeLayout.Width * 1f / cameraSize.Height;
            }
            else
            {
                wid   = options.OutWidth;
                hgt   = options.OutHeight;
                ratio = relativeLayout.Height * 1f / cameraSize.Height;
            }

            float[] f  = new float[9];
            float[] f1 = new float[9];
            matrix.GetValues(f);
            framMatrix.GetValues(f1);
            f[0] = f[0] / ratio;
            f[4] = f[4] / ratio;
            f[5] = f[5] / ratio;
            f[2] = f[2] / ratio;

            f1[0] = f1[0] / ratio;
            f1[4] = f1[4] / ratio;
            f1[5] = f1[5] / ratio;
            f1[2] = f1[2] / ratio;
            matrix.SetValues(f);
            framMatrix.SetValues(f1);
            Bitmap newBitmap = Bitmap.CreateBitmap(wid, hgt, Bitmap.Config.Argb8888);

            Canvas canvas       = new Canvas(newBitmap);
            Bitmap cameraBitmap = BitmapFactory.DecodeByteArray(data, 0, data.Length, options);

            canvas.DrawBitmap(cameraBitmap, nm, null);
            cameraBitmap.Recycle();

            canvas.DrawBitmap(bitmap, matrix, null);
            bitmap.Recycle();


            Bitmap bbb = Bitmap.CreateScaledBitmap(bitmap2, cameraBitmap.Height, cameraBitmap.Width, false);

            canvas.DrawBitmap(bbb, new Matrix(), null);
            bbb.Recycle();

            Java.IO.File storagePath = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory + "/PhotoAR/");
            storagePath.Mkdirs();

            Java.IO.File myImage = new Java.IO.File(storagePath, Long.ToString(JavaSystem.CurrentTimeMillis()) + ".jpg");

            try
            {
                //string path = System.IO.Path.Combine(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryPictures).AbsolutePath, "newProdict.png");
                string path = myImage.AbsolutePath;
                var    fs   = new FileStream(path, FileMode.OpenOrCreate);
                if (fs != null)
                {
                    newBitmap.Compress(Bitmap.CompressFormat.Jpeg, 80, fs);
                    fs.Close();
                }
                //Stream outs = new FileOutputStream(myImage);
                //newBitmap.Compress(Bitmap.CompressFormat.Jpeg, 80, outs);

                //out.flush();
                //out.close();
            }
            catch (System.Exception e)
            {
                Log.Debug("In Saving File", e + "");
            }
        }
Пример #27
0
        internal Bitmap ProcessImage(byte[] data, Android.Hardware.Camera camera)
        {
            Bitmap newBitmap = null;

            try
            {
                // TODO Auto-generated method stub
                int orientation = Exif.GetExifOrientations(data);
                BitmapFactory.Options options = new BitmapFactory.Options();
                //o.inJustDecodeBounds = true;
                Bitmap cameraBitmapNull = BitmapFactory.DecodeByteArray(data, 0, data.Length, options);
                Bitmap bitmapPicture    = null;
                int    extraangle       = 180;
                switch (orientation)
                {
                case 90:
                    bitmapPicture = RotateImage(cameraBitmapNull, 180);

                    break;

                case 180:
                    bitmapPicture = RotateImage(cameraBitmapNull, 270);

                    break;

                case 270:
                    bitmapPicture = RotateImage(cameraBitmapNull, 360);

                    break;

                case 0:
                    bitmapPicture = RotateImage(cameraBitmapNull, 90);
                    break;
                // if orientation is zero we don't need to rotate this

                default:
                    bitmapPicture = RotateImage(cameraBitmapNull, 90);
                    break;
                }
                int    wid = options.OutWidth;
                int    hgt = options.OutHeight;
                Matrix nm  = new Matrix();

                Android.Hardware.Camera.Size cameraSize = camera.GetParameters().PictureSize;
                float ratio = mPreview.Height * 1f / cameraSize.Height;
                if (Resources.Configuration.Orientation != Android.Content.Res.Orientation.Landscape)
                {
                    //nm.PostRotate(90);
                    //nm.PostTranslate(hgt, 0);
                    wid   = options.OutHeight;
                    hgt   = options.OutWidth;
                    ratio = mPreview.Width * 1f / cameraSize.Height;
                }
                else
                {
                    wid   = options.OutWidth;
                    hgt   = options.OutHeight;
                    ratio = mPreview.Height * 1f / cameraSize.Height;
                }

                float[] f = new float[9];
                matrix.GetValues(f);
                f[0] = f[0] / ratio;
                f[4] = f[4] / ratio;
                f[5] = f[5] / ratio;
                f[2] = f[2] / ratio;


                matrix.SetValues(f);
                newBitmap = Bitmap.CreateBitmap(wid, hgt, Bitmap.Config.Argb8888);

                Canvas canvas = new Canvas(newBitmap);
                //Bitmap cameraBitmap = BitmapFactory.DecodeByteArray(data, 0, data.Length, options);

                canvas.DrawBitmap(bitmapPicture, nm, null);


                canvas.DrawBitmap(bitmaptrophy, matrix, null);
                camera.StartPreview();
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine("ON PICTURE Ex:" + ex.ToString());
            }
            return(newBitmap);
        }
Пример #28
0
        private void startCamera()
        {
            if (ContextCompat.CheckSelfPermission(context, Manifest.Permission.Camera)
                != Android.Content.PM.Permission.Granted)
            {
                if (permissionCallback != null)
                {
                    permissionCallback.onRequestPermission();
                }
                return;
            }
            if (camera == null)
            {
                Android.Hardware.Camera.CameraInfo cameraInfo = new Android.Hardware.Camera.CameraInfo();
                for (int i = 0; i < Android.Hardware.Camera.NumberOfCameras; i++)
                {
                    Android.Hardware.Camera.GetCameraInfo(i, cameraInfo);
                    if ((int)cameraInfo.Facing == cameraFacing)
                    {
                        cameraId = i;
                    }
                }
                camera = Android.Hardware.Camera.Open(cameraId);
            }
            //        if (parameters == null) {
            //            parameters = camera.getParameters();
            //            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            //        }


            int detectRotation = 0;

            if (cameraFacing == 1)
            {
                int rotation = ORIENTATIONS.Get(displayOrientation);
                rotation = getCameraDisplayOrientation(rotation, cameraId, camera);
                camera.SetDisplayOrientation(rotation);
                detectRotation = rotation;
                if (displayOrientation == 0)
                {
                    if (detectRotation == 90 || detectRotation == 270)
                    {
                        detectRotation = (detectRotation + 180) % 360;
                    }
                }
            }
            else if (cameraFacing == 0)
            {
                int rotation = ORIENTATIONS.Get(displayOrientation);
                rotation = getCameraDisplayOrientation(rotation, cameraId, camera);
                camera.SetDisplayOrientation(rotation);
                detectRotation = rotation;
            }
            else if (cameraFacing == 2)
            {
                camera.SetDisplayOrientation(0);
                detectRotation = 0;
            }

            opPreviewSize(preferredWidth, preferredHeight);
            Android.Hardware.Camera.Size size = camera.GetParameters().PreviewSize;
            if (detectRotation % 180 == 90)
            {
                previewView.setPreviewSize(size.Height, size.Width);
            }
            else
            {
                previewView.setPreviewSize(size.Width, size.Height);
            }
            int temp = detectRotation;

            try
            {
                // if (cameraFacing == ICameraControl.CAMERA_USB) {
                // camera.SetPreviewTexture(textureView.getSurfaceTexture());
                //            } else {
                //            surfaceTexture = new SurfaceTexture(11);
                //            camera.setPreviewTexture(surfaceTexture);
                //            uiHandler.post(new Runnable() {
                //                @Override
                //                public void run() {
                //
                //                    if (textureView != null) {
                //                        surfaceTexture.detachFromGLContext();
                //                        textureView.setSurfaceTexture(surfaceTexture);
                //                    }
                //                }
                //            });
                // }
                //            camera.addCallbackBuffer(new byte[size.width * size.height * 3 / 2]);
                //            camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
                //
                //                @Override
                //                public void onPreviewFrame(byte[] data, Camera camera) {
                //                    Log.i("wtf", "onPreviewFrame-->");
                //                    onFrameListener.onPreviewFrame(data, temp, size.width, size.height);
                //                    camera.addCallbackBuffer(data);
                //           ad     }
                //            });
                //    camera.setPreviewCallback(new Camera.PreviewCallback() {

                //    public void onPreviewFrame(byte[] data, Camera camera)
                //    {
                //        LogUtil.i("wtf", "onPreviewFrame-->");
                //        onFrameListener.onPreviewFrame(data, temp, size.width, size.height);
                //    }
                //});
            }
            catch (IOException e)
            {
                e.PrintStackTrace();
                LogUtil.i("wtf", e.ToString());
            }
            catch (RuntimeException e)
            {
                e.PrintStackTrace();
                LogUtil.i("wtf", e.ToString());
            }
        }