如何了解iPhone或iPad相机的视场角?

4
在Android中,API提供了视野角度的字段:
  1. Camera.Parameters.getHorizontalViewAngle()
  2. Camera.Parameters.getVerticalViewAngle()
iOS中的等效方法是什么? 我不想预先编写这些值,因为它不够灵活。
2个回答

1
我不太确定在此上下文中,“水平”和“垂直”是什么意思,但我想到了两个计算,关于“z”轴的旋转(即我们在照片中与地平线有多平行),以及向前和向后倾斜的程度(即绕“x”轴的旋转,即指向上还是向下)。您可以使用Core Motion来完成这项工作。只需将其添加到您的项目,然后您可以执行以下操作:
  1. 确保导入CoreMotion头文件:

    #import <CoreMotion/CoreMotion.h>
    
  2. 定义一些类属性:

    @property (nonatomic, strong) CMMotionManager *motionManager;
    @property (nonatomic, strong) NSOperationQueue *deviceQueue;
    
  3. 启动运动管理器:

    - (void)startMotionManager
    {
        self.deviceQueue = [[NSOperationQueue alloc] init];
        self.motionManager = [[CMMotionManager alloc] init];
        self.motionManager.deviceMotionUpdateInterval = 5.0 / 60.0;
    
        [self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical
                                                                toQueue:self.deviceQueue
                                                            withHandler:^(CMDeviceMotion *motion, NSError *error)
        {
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                CGFloat x = motion.gravity.x;
                CGFloat y = motion.gravity.y;
                CGFloat z = motion.gravity.z;
    
                // 围绕z轴旋转了多少
    
                CGFloat rotationAngle = atan2(y, x) + M_PI_2;                  // 弧度
                CGFloat rotationAngleDegrees = rotationAngle * 180.0f / M_PI;  // 度数
    
                // 向前和向后倾斜了多少
    
                CGFloat r = sqrtf(x*x + y*y + z*z);
                CGFloat tiltAngle = (r == 0.0 ? 0.0 : acosf(z/r);              // 弧度
                CGFloat tiltAngleDegrees = tiltAngle * 180.0f / M_PI - 90.0f); // 度数
            }];
        }];
    }
    
  4. 完成后,停止运动管理器:

    - (void)stopMotionManager
    {
        [self.motionManager stopDeviceMotionUpdates];
        self.motionManager = nil;
        self.deviceQueue = nil;
    }
    
我在这里没有对这些值进行任何操作,但您可以将它们保存在类属性中,然后在应用程序的其他位置访问它们。或者您可以直接从这里向主队列发送UI更新。有很多选择。
由于这是iOS 5及更高版本,如果应用程序支持早期版本,您可能还想弱链接Core Motion,然后检查一切是否正常,如果不正常,就意识到您无法捕获设备的方向:
if ([CMMotionManager class]) 
{
    // ok, core motion exists
}

如果你对我选择每秒十二次的相对随意有疑问,iOS事件处理指南建议在仅检查设备方向时每秒10-20次。


我的意思是相机的视野角度。 - Benson
@BingchenYang 哈哈,抱歉我误解了问题。在iOS中,用于查询/控制相机的API有点基础。希望其他人能在这里帮助你,但很有可能你无法做到这一点(除非维护有效焦距表并查找设备以及使用前置或后置摄像头)。 - Rob
1
感谢您的努力。这看起来是很多工作。我在网站http://www.caramba-apps.com/blog/files/field-of-view-angles-ipad-iphone.html上找到了一些相关的材料,但如果有通过API了解相机规格的方法会更好。 - Benson
@BingchenYang 同意。你的链接就像我找到的那些一样(尽管我当时是在搜索“有效焦距”,但底线是相等的)。可悲的是,尽管曾经有人建议他们要开放他们的私有相机API并将其变成公共接口,但Apple一直不愿意这样做。也许有一些公共接口至今仍然逃脱了我的发现,但我认为不会这样。 - Rob

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接