2009-10-28 6 views
3

Есть ли способ получить разрешение камеры iPhone? По-видимому, у 3G есть 1200x1600, а 3GS - 1500x2000, но как получить эти значения изнутри моего кода (без снятия картинки). Мне нужно, чтобы они сделали какое-то аффинное преобразование в предварительный просмотр камеры.Получите разрешение камеры iPhone?

Я мог бы определить, является ли это 3G или 3GS жестко кодировать эти значения, но это только крайний случай.

ответ

7

Я думаю, что ваше «последнее средство» является хорошим решением.

Что случилось с обнаружением модели? Аппаратное обеспечение не изменится ни для одной из этих моделей. Единственное, что может возникнуть у вас, это 3GSX-R или что-то выходит с 16-мегапиксельной камерой. В этот момент вам, вероятно, придется обновлять приложение в любом случае и просто добавить другое значение в список.

Я голосую за обнаружение модели.

+0

Я откладывался именно по этой причине: если компании Apple делает еще один iPhone с различным разрешением камеры, я бы быть вынужденным сделать обновление моего приложения. Ну, предположим, мне нужно будет придерживаться этого. Спасибо за ответ. – iamj4de

+0

Причина, по которой я так выразился, заключается в том, что если Apple сделает еще один iPhone, есть вполне вероятные ДРУГИЕ причины, по которым вам нужно будет обновить свое приложение. – snicker

0

Поскольку Apple не позволяет вам напрямую разговаривать с оборудованием, на законный продукт App Store не так уж и много.

0

Хотя я думаю, что ответ снайзера определенно правильный. Я думал, что отправлю это для удовольствия.

Вы можете просмотреть сохраненный фотоальбом пользователей на iPhone (я делаю смелое предположение, что это можно сделать программно на iPhone без ограничений !!), полагая, что фотографии на телефоне в основном были сделаны с в телефоне это само по себе, вы могли бы затем определить, что такое среднее разрешение фотографии и катить с этим.

+0

Все идет! Этот понижающий звук немного суровый! – Lee

+2

Люди нахмурились на «веселые» ответы. Мне пришлось научиться шутить в комментариях =] – snicker

+0

К сожалению, ваше смелое предположение неверно. Существует не документированный способ программно просматривать библиотеку фотографий. –

0

Почему бы вам не сделать снимок? Используйте метод UIImagePickerController takePicture, указав пользователю, что это необходимый шаг калибровки. После этого посмотрите на разрешение изображения, настойчиво сохраните значение и удалите изображение, которое вы сделали. После этого вы получите свое разрешение и сможете применить преобразование на нем.

+0

Потому что я не хочу преобразовывать сделанное изображение, а в камеру предварительного просмотра. Я не могу назвать takePicture для этого. – iamj4de

2

Вам действительно нужно знать разрешение изображения для настройки аффинного преобразования? Поскольку представление предварительно настроено для охвата ширины экрана, вы можете изменить преобразование в зависимости от того, какую часть экрана вы хотите заняться, т. Е. Если вам нужно, чтобы предварительный просмотр составлял 160 пикселей, просто сжимайте его 50% от значения по умолчанию. Я делаю это в приложении сейчас, и он работает на новых и старых iPhone ...

+0

Это, вероятно, правильный способ сделать это. Я предполагаю, что вы имеете в виду свойство cameraViewTransform в UIImagePickerController? –

+0

да, я использую код как \t self.camera.cameraViewTransform = CGAffineTransformTranslate (CGAffineTransformMakeScale (0.5f, 0.5f), -160, -211); \t , чтобы получить информацию в строке ... –

+1

Потому что есть случаи, когда мне нужно сделать сложную трансформацию, составленную из перевода + поворот + масштаб. И без разрешения камеры это невозможно. – iamj4de

2

Сообщение старое, но оно почти первое в google, и оно не имеет действительного ответа, так что вот еще один опция:

Решение для iOS от 4.x до 7.х

Это все с точки зрения 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. 1-й объект вместо этого дает размеры видео (или, скорее, видеокадры). – neeraj

+0

Не работает для меня: 0,0 –

+0

@neeraj в обычном порядке, вы должны исследовать весь порт и проверить, является ли '[[media_type_type] isEqualToString: AVMediaTypeVideo ] ' – Rosik

Смежные вопросы