zoukankan      html  css  js  c++  java
  • 捕获高像素照片(updated)

        可以使用Windows.Phone.Media.Capture.PhotoCaptureDevice 进行高像素图片的捕获(需要自己画视图界面,因为该平台的PhotoChooserTask API 不支持捕获高像素的功能),并且需要使用预定义像素分辨率手动设置捕获的像素。需要注意的额外的像素是没有从 PhotoCaptureDevice 类的获取手机支持分辨率的静态方法 IReadOnlyList<Size> GetAvailabeCaptureResolutions() 方法中检索到的。还有就是为了让 PhotoCaptureDevice 正常工作ID_CAP_ISV_CAMERA功能声明需要添加到清单文件WMAppManifest.xml

      

    下面是可以手动获取的支持高分辨率的设备型号

     手机型号变体 手动配置高像素的选项
     Lumia 1020 RM-875, RM-876, RM-877 7712x4352 (16:9), 7136x5360 (4:3)
     Lumia 1520 RM-937, RM-938, RM-939 5376x3024 (16:9), 4992x3744 (4:3)


    为高像素拍摄初始化相机

        下面的示例代码演示你如何在应用中创建简单的取景器,并且初始化高像素 photo capture。下面

    的代码是使用 VideoBrush 作为 canvas 的背景:

    <!-- Simple viewfinder page -->
    <phone:PhoneApplicationPage x:Class="ViewfinderPage" ... >
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid x:Name="ContentPanel">
                <Canvas x:Name="Canvas" ... >
                    <Canvas.Background>
                        <VideoBrush x:Name="ViewfinderVideoBrush" Stretch="Uniform"/>
                    </Canvas.Background>
                </Canvas>
            </Grid>
        </Grid>
    </phone:PhoneApplicationPage>  

        在相应的 C# 页面,向以往相同,先初始化 PhotoCaptureDevice,这里需要添加额外的代码检测

    设备的型号,从而根据条件进行选择,并且在 IAsyncOperation<PhotoCaptureDevice> OpenAsync(CameraSensorLocation senor, Size initialRsolution) 方法中初始化高分辨率的尺寸。需要注意的是你只能每次使用一种分辨率捕获一张照片,所以如果你需要高像素的版本和低像素

    的版本的图片,你可以先捕获一张高像素照片,然后对它进行操作,比如使用 Nokia Imaging SDK 对它进行压缩

    尺寸来获得另一个版本的图片。

    using Microsoft.Devices;
    using Windows.Phone.Media.Capture;
    
    ...
    
    public partial class ViewfinderPage : PhoneApplicationPage
    {
        private const CameraSensorLocation SENSOR_LOCATION = CameraSensorLocation.Back;
    
        private PhotoCaptureDevice _device = null;
        private bool _focusing = false;
        private bool _capturing = false;
    
        ...
    
        ~ViewfinderPage()
        {
            if (_device != null)
            {
                UninitializeCamera();
            }
        }
    
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
    
            if (_device == null)
            {
                InitializeCamera();
            }
        }
    
        protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
        {
            if ((_focusing || _capturing) && e.IsCancelable)
            {
                e.Cancel = true;
            }
    
            base.OnNavigatingFrom(e);
        }
    
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
    
            if (_device != null)
            {
                UninitializeCamera();
            }
        }
    
        /// <summary>
        /// Synchronously initialises the photo capture device for a high resolution photo capture.
        /// Viewfinder video stream is sent to a VideoBrush element called ViewfinderVideoBrush, and
        /// device hardware capture key is wired to the CameraButtons_ShutterKeyHalfPressed and
        /// CameraButtons_ShutterKeyPressed methods.
        /// </summary>
        private void InitializeCamera()
        {
            Windows.Foundation.Size captureResolution;
    
            var deviceName = DeviceStatus.DeviceName;
    
            if (deviceName.Contains("RM-875") || deviceName.Contains("RM-876") || deviceName.Contains("RM-877"))
            {
                captureResolution = new Windows.Foundation.Size(7712, 4352); // 16:9 ratio
                //captureResolution = new Windows.Foundation.Size(7136, 5360); // 4:3 ratio
            }
            else if (deviceName.Contains("RM-937") || deviceName.Contains("RM-938") || deviceName.Contains("RM-939"))
            {
                captureResolution = new Windows.Foundation.Size(5376, 3024); // 16:9 ratio
                //captureResolution = new Windows.Foundation.Size(4992, 3744); // 4:3 ratio
            }
            else
            {
                captureResolution = PhotoCaptureDevice.GetAvailableCaptureResolutions(SENSOR_LOCATION).First();
            }
    
            var task = PhotoCaptureDevice.OpenAsync(SENSOR_LOCATION, captureResolution).AsTask();
    
            task.Wait();
    
            _device = task.Result;
    
            ViewfinderVideoBrush.SetSource(_device);
    
            if (PhotoCaptureDevice.IsFocusSupported(SENSOR_LOCATION))
            {
                Microsoft.Devices.CameraButtons.ShutterKeyHalfPressed += CameraButtons_ShutterKeyHalfPressed;
            }
    
            Microsoft.Devices.CameraButtons.ShutterKeyPressed += CameraButtons_ShutterKeyPressed;
    
            ...
        }
    
        /// <summary>
        /// Uninitialises the photo capture device and unwires the device hardware capture keys.
        /// </summary>
        private void UninitializeCamera()
        {
            if (PhotoCaptureDevice.IsFocusSupported(SENSOR_LOCATION))
            {
                Microsoft.Devices.CameraButtons.ShutterKeyHalfPressed -= CameraButtons_ShutterKeyHalfPressed;
            }
    
            Microsoft.Devices.CameraButtons.ShutterKeyPressed -= CameraButtons_ShutterKeyPressed;
    
            _device.Dispose();
            _device = null;
        }
    
        ...
    }  


    拍摄

    现在设备的相机已经初始化完成了,设备的拍照按键可以是相机进行自动对焦,并且捕获一张高像素照片

    ...
    
    public partial class ViewfinderPage : PhoneApplicationPage
    {
        ...
    
        /// <summary>
        /// Asynchronously autofocuses the photo capture device.
        /// </summary>
        private async void CameraButtons_ShutterKeyHalfPressed(object sender, EventArgs e)
        {
            if (!_focusing && !_capturing)
            {
                _focusing = true;
    
                await _device.FocusAsync();
    
                _focusing = false;
            }
        }
    
        /// <summary>
        /// Asynchronously captures a frame for further usage.
        /// </summary>
        private async void CameraButtons_ShutterKeyPressed(object sender, EventArgs e)
        {
            if (!_focusing && !_capturing)
            {
                _capturing = true;
    
                var stream = new MemoryStream();
    
                try
                {
                    var sequence = _device.CreateCaptureSequence(1);
                    sequence.Frames[0].CaptureStream = stream.AsOutputStream();
    
                    await _device.PrepareCaptureSequenceAsync(sequence);
                    await sequence.StartCaptureAsync();
                }
                catch (Exception ex)
                {
                    stream.Close();
                }
    
                _capturing = false;
    
                if (stream.CanRead)
                {
                    // We now have the captured image JPEG data in variable "stream" for further usage
                }
            }
        }
    
        ...
    }  


    获得一个全功能的“单击画面对焦”、“在捕获时冻结预览”,可以参考示例代码  Photo Inspector

    Nokia WiKi 原文链接:http://developer.nokia.com/Resources/Library/Lumia/#!imaging/working-with-high-resolution-photos/capturing-high-resolution-photos.html



  • 相关阅读:
    What version of .NET Framework is integrated into what version of OS?
    《千字文》古今第一文,1000字无重复,囊括各个方面的知识!
    这些习惯正在阻碍你的成长(你正在做。。。)
    百家讲坛另附笔记
    百家讲坛之曾国藩笔记
    《挪威的森林》经典语录
    《悲伤逆流成河》台词摘抄
    2018年11月29日,晴
    关于描述的一些感悟
    2018年11月27日, 晴
  • 原文地址:https://www.cnblogs.com/hebeiDGL/p/3314995.html
Copyright © 2011-2022 走看看