2013-07-10 5 views
6

Voglio zoomare una telecamera usando UISlider.desidera la funzionalità di zoom nella fotocamera iphone utilizzando il framework AVFoundation

ho fatto con successo regolando il AffineTransform di AVCaptureVideoPreviewLayer.

Ecco il codice di esso

-(void)sliderAction:(UISlider*)sender{ 
    CGAffineTransform affineTransform = CGAffineTransformMakeTranslation(sender.value, sender.value); 
    affineTransform = CGAffineTransformScale(affineTransform, sender.value, sender.value); 
    affineTransform = CGAffineTransformRotate(affineTransform, 0); 
    [CATransaction begin]; 
    [CATransaction setAnimationDuration:.025]; 
    //previewLayer is object of AVCaptureVideoPreviewLayer 
    [[[self captureManager]previewLayer] setAffineTransform:affineTransform]; 
    [CATransaction commit]; 
} 

ma quando mi cattura esso, io sono sempre non oggetto ingrandita dell'immagine.

+0

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html....pls controllare cara o http : //stackoverflow.com/questions/5794892/custom-camera-zoom-functionality-on-iphone – Anjaneyulu

+0

applica la stessa trasformazione all'immagine che hai catturato forse? – marko

risposta

0

Prima il codice esegue lo zoom solo nel contenuto del livello non CMSampleBuffer. Il tuo prossimo lavoro è di creare una scala su CVPixelBuffer da CMSampleBuffer e di salvare in scala CMSampleBuffer a AVWriter. È possibile utilizzare Accelerate.framework per scalare CVPixelBuffer.

3

È un po 'tardi per rispondere. Ma sto rispondendo per riferimento futuro. In realtà ciò che hai fatto nel tuo codice è solo che hai cambiato il fattore di zoom del livello di anteprima e non la connessione di output sottostante. Ma affinché lo zoom venga riflesso in origine sull'output acquisito, è necessario inserire anche il fattore nella connessione di output. È possibile utilizzare qualcosa di simile al seguente:

-(void)sliderAction:(UISlider*)sender 
{ 
    AVCaptureConnection* connection = [self.photoOutput connectionWithMediaType:AVMediaTypeVideo]; // photoOutput is a AVCaptureStillImageOutput object, representing a capture session output with customized preset 

    CGAffineTransform affineTransform = CGAffineTransformMakeTranslation(sender.value, sender.value); 
    affineTransform = CGAffineTransformScale(affineTransform, sender.value, sender.value); 
    affineTransform = CGAffineTransformRotate(affineTransform, 0); 
    [CATransaction begin]; 
    [CATransaction setAnimationDuration:.025]; 
    //previewLayer is object of AVCaptureVideoPreviewLayer 
    [[[self captureManager]previewLayer] setAffineTransform:affineTransform]; 
    if (connection) { 
     connection.videoScaleAndCropFactor = sender.value; 
    } 
    [CATransaction commit]; 
} 

E dovrebbe fare il trucco.

Idealmente, non è necessario eseguire il cambiamento nella vostra connection.videoScaleAndCropFactorSlider routine e dovrebbe inserire il codice nella vostra routine di cattura originale e impostare solo una volta con il valore momentaneo del dispositivo di scorrimento, proprio prima di chiamare captureStillImageAsynchronouslyFromConnection metodo.

Speranza che aiuta :)

+0

Grazie al tuo ricordo di 'videoScaleAndCropFactor'! – jianpx

Problemi correlati