根据设备方向转动相机图片 (Xamarin.iOS)

Posted

技术标签:

【中文标题】根据设备方向转动相机图片 (Xamarin.iOS)【英文标题】:Turn camera picture depending on the device orientation (Xamarin.iOS) 【发布时间】:2017-10-26 09:04:09 【问题描述】:

我想制作一个 Xamarin.ios 应用程序,我可以在其中像相机一样捕捉图片...我的应用程序仅支持纵向。

如果我在拍摄照片时相机是横向的,我想将拍摄的照片变成纵向。

有人知道我该怎么做吗?

代码

    public async void CapturePhoto()
    

        var videoConnection = stillImageOutput.ConnectionFromMediaType(AVMediaType.Video);
        var sampleBuffer = await stillImageOutput.CaptureStillImageTaskAsync(videoConnection);

        var jpegImageAsBytes = AVCaptureStillImageOutput.JpegStillToNSData(sampleBuffer).ToArray();

        string base64StringImage = Convert.ToBase64String(jpegImageAsBytes);

        FaceRecognition faceRecognition = new FaceRecognition();
        int result = faceRecognition.SendPhoto(base64StringImage);
      

【问题讨论】:

@ColeXia 但是我怎么知道设备是 LandscapeLeft,可能它也可能是 Portrait 或 LandscapeRight... 【参考方案1】:

试试这个:

var currentOrientation = UIApplication.SharedApplication.StatusBarOrientation;

if (currentOrientation == UIInterfaceOrientation.Portrait)

    videoConnection.VideoOrientation = AVCaptureVideoOrientation.Portrait;

else if (currentOrientation == UIInterfaceOrientation.LandscapeRight)

    videoConnection.VideoOrientation = AVCaptureVideoOrientation.LandscapeRight;

//xxx

更新:

如果应用仅支持方向或您锁定屏幕,则还有另一种检测设备方向的旧方法。 Core Motion

public void LockOrientation()

    CMMotionManager CMManager = new CMMotionManager();
    CMManager.DeviceMotionUpdateInterval = 0.2f;
    CMManager.StartDeviceMotionUpdates(NSOperationQueue.MainQueue, (motion, error) => 
        if (Math.Abs(motion.Gravity.X) > Math.Abs(motion.Gravity.Y))
        
            Console.WriteLine("Lan");
            if (motion.Gravity.X > 0)
            
                UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.LandscapeLeft), new NSString("orientation"));
                Console.WriteLine("Left");
            
            else
            
                UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.LandscapeRight), new NSString("orientation"));
                Console.WriteLine("Right");
            
        
        else
        
            if (motion.Gravity.Y >= 0)
            
                Console.WriteLine("Down");
            
            else
            
                Console.WriteLine("UP");
            
        

        CMManager.StopDeviceMotionUpdates();
    );

参考here

【讨论】:

我解决了这个问题...我不得不用 videoConnection 替换 stillImageOutput。感谢您的帮助 但是还有一个问题,当我只允许纵向布局时,状态栏总是在顶部并且它不会工作......你有其他想法而不是状态栏的方向吗?跨度> forums.developer.apple.com/thread/62004,如果有帮助请告诉我。@Dominic 这看起来不错,但它告诉我要迟到的方向......(一切都已经完成之后) 所以它现在可以工作了...我只需要您的部分代码而不是全部...谢谢您的帮助

以上是关于根据设备方向转动相机图片 (Xamarin.iOS)的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 在相机流中不可见 (Xamarin.iOS)

三星 Galaxy S3、S4、S5 的 Android 相机/图片方向问题

web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)

web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)

根据路线上的方向转动(旋转)标记位置

如何根据方向元数据旋转 JPEG 图像?