2009-10-28 79 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