2013-07-10 7 views
6

Chcę powiększyć kamerę przy użyciu UISlider.Funkcja powiększania w aparacie iPhone z wykorzystaniem ram AVFoundation

Zrobiłem go z powodzeniem dostosowując AffineTransform z AVCaptureVideoPreviewLayer.

Oto kod tego

-(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]; 
} 

ale kiedy go uchwycić, jestem coraz nieprzestrzegania powiększony obiekt obrazu.

+0

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html....pls sprawdzić to droga lub http : //stackoverflow.com/questions/5794892/custom-camera-zoom-functionality-on-iphone – Anjaneyulu

+0

zastosować tę samą transformację do uchwyconego obrazu? – marko

Odpowiedz

0

Najpierw Twój kod powiększa zawartość tylko warstwy nie CMSampleBuffer. Następna praca polega na utworzeniu skali na CVPixelBuffer z CMSampleBuffer i zapisaniu skalowania CMSampleBuffer na AVWriter. Możesz użyć Accelerate.framework do skalowania CVPixelBuffer.

3

Trochę za późno na odpowiedź. Ale odpowiadam na przyszłe referencje. W rzeczywistości to, co zrobiłeś w swoim kodzie, to tylko to, że zmieniłeś współczynnik powiększenia warstwy podglądu, a nie bazowe połączenie wyjściowe. Ale aby zoom był oryginalnie odzwierciedlony na wychwyconym wyjściu, musisz również umieścić czynnik w twoim połączeniu wyjściowym. Możesz użyć czegoś podobnego do poniższego:

-(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]; 
} 

To powinno wystarczyć.

Idealnie, nie należy wykonywać na zmianę connection.videoScaleAndCropFactor w rutynowych Slider i należy umieścić kod w swoim oryginalnym rutyny przechwytywania i ustawić go tylko raz z chwilowej wartości suwaka, tuż przed wywołaniem captureStillImageAsynchronouslyFromConnection metody.

Nadzieja to pomaga :)

+0

Dzięki przypominaniu 'videoScaleAndCropFactor'! – jianpx