2009-10-28 75 views
3

有什么办法可以获得iPhone相机的分辨率吗?显然,3G有1200x1600,而3GS有1500x2000,但是如何从我的代码中获取这些值(不需要拍照)。我需要他们对相机预览进行仿射变换。获取iPhone的相机分辨率?

我可以检测是3G或3GS硬编码这些值,但它只是最后的手段。

回答

7

我认为你的“最后的手段”是一个很好的解决方案。

检测模型有什么问题?这些型号的硬件不会改变。唯一可能的问题是如果3GSX-R或其他产品带有16mpx摄像头。无论如何,您可能必须更新您的应用程序,并且可以将其他值添加到列表中。

我投了模型检测。

+0

我被推迟正是由这个原因:如果苹果使另一部iPhone不同的相机分辨率,我会被迫更新我的应用程序。噢,好吧,我想我会继续坚持下去。感谢您的回应。 – iamj4de 2009-10-29 08:03:09

+0

我之所以这样说是因为如果苹果生产另一款iPhone,很可能还有其他原因需要更新您的应用程序。 – snicker 2009-10-29 14:20:12

0

由于Apple不允许您直接与硬件通话,因此合法的App Store产品没有多少选择。

0

虽然我认为snicker的答案绝对是正确的。我想我会发布这个有趣的。

你可以通过看在iPhone上用户存储的相册(我想提出一个大胆的假设,这可以通过编程对iPhone进行没有任何限制!)使该手机上的照片大多拍摄的假设电话是自己的,然后你可以计算出平均照片分辨率是多少,然后滚动。

+0

Aww加油!这个downvote有点苛刻! – Lee 2009-10-28 17:28:13

+2

人们对“有趣”的回答皱眉。我不得不学会开始在评论中开玩笑=] – snicker 2009-10-28 17:29:19

+0

不幸的是,你大胆的假设是不正确的。没有书面的方式来以编程方式浏览照片库。 – 2009-10-28 17:33:15

0

为什么你不想拍照?使用UIImagePickerController的takePicture方法,指示用户这是一个必要的校准步骤。之后,查看图片的分辨率,持续保存该值,然后删除您拍摄的图片。之后,您将获得您的解决方案,并能够对其进行应用。

+0

因为我不想对拍摄的照片进行转换,而是对预览相机进行转换。我无法调用takePicture来做到这一点。 – iamj4de 2010-01-20 19:36:28

2

你真的需要知道图像的分辨率来设置仿射变换吗?由于视图是预先设置的以覆盖屏幕的宽度,因此您可以根据要采用的屏幕分数来更改变换,例如,如果需要预览为160像素,则缩小50%来自默认值。我现在在一个应用程序中执行此操作,它适用于新旧iPhone ...

+0

这可能是正确的做法。我假设你指的是UIImagePickerController上的cameraViewTransform属性? – 2009-11-19 17:59:44

+0

是的,我使用的代码如 \t self.camera.cameraViewTransform = CGAffineTransformTranslate(CGAffineTransformMakeScale(0.5f,0.5f),-160,-211); \t 让事情排队...... – 2009-11-21 23:29:51

+1

因为有些情况下我需要进行复杂的转换,由翻译+旋转+缩放组成。没有相机分辨率,这是不可能的。 – iamj4de 2010-01-20 19:39:36

2

该帖子旧,但它几乎是谷歌的第一个,它没有有效的答案,所以这里有一个选项:

适用于iOS的解决方案,从4.x到7。X

这一切都在AV Foundation框架方面AVCaptureSession,配置并启动你可以发现里面的视频尺寸

[[[session.inputs.lastObject] ports].lastObject formatDescription]变量

这里的大致代码:

AVCaptureSession* session = ...; 
AVCaptureDevice *videoCaptureDevice = ...; 
AVCaptureDeviceInput *videoInput = ...; 

[session beginConfiguration]; 
if ([session canAddInput:videoInput]) {[session addInput:videoInput];} 
[session commitConfiguration]; 
[session startRunning]; 

//this is the clue 
AVCaptureInputPort *port = videoInput.ports.lastObject; 
if ([port mediaType] == AVMediaTypeVideo) 
{ 
    videoDimensions = CMVideoFormatDescriptionGetDimensions([port formatDescription]); 
} 

解决方案iOS8上

苹果也再次改变一切:现在你必须认购AVCaptureInputPortFormatDescriptionDidChangeNotification

下面是示例:

-(void)initSession 
{ 
    AVCaptureSession* session = ...; 
    AVCaptureDevice *videoCaptureDevice = ...; 
    AVCaptureDeviceInput *videoInput = ...; 

    [session beginConfiguration]; 
    if ([session canAddInput:videoInput]) {[session addInput:videoInput];} 
    [session commitConfiguration]; 
    [session startRunning]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(avCaptureInputPortFormatDescriptionDidChangeNotification:) 
      name:@"AVCaptureInputPortFormatDescriptionDidChangeNotification" 
      object:nil]; 
} 

-(void)avCaptureInputPortFormatDescriptionDidChangeNotification:(NSNotification *)notification 
{ 
    AVCaptureInputPort *port = [videoInput.ports objectAtIndex:0]; 
    CMFormatDescriptionRef formatDescription = port.formatDescription; 
    if (formatDescription) { 
     videoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription); 
    } 

} 
+0

最后一个对象将尺寸返回为0x0。第一个对象是给视频的尺寸(或者更确切地说是视频帧)。 – neeraj 2013-04-04 13:50:39

+0

不适用于我:0,0 – 2014-07-18 11:25:55

+0

@neeraj以正常方式,您应该探测所有端口并检查是否[[port mediaType] isEqualToString:AVMediaTypeVideo ]' – Rosik 2014-12-08 19:32:13