2013-07-10 9 views
6

UISliderを使用してカメラをズームしたいとします。AVFoundationフレームワークを使用してiphoneカメラのズーム機能が必要

私はAVCaptureVideoPreviewLayerのAffineTransformを調整することにより、正常に行っています。ここで

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

が、私はそれをキャプチャするとき、私は画像の非ズームオブジェクトを取得していますのコードです。

+0

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html....plsそれは親愛なるまたはhttpチェック://stackoverflow.com/questions/5794892/custom-camera-zoom-functionality-on-iphone – Anjaneyulu

+0

おそらくキャプチャした画像に同じ変換を適用しますか? – marko

答えて

0

最初にレイヤーのコンテンツのみをズームするコードはCMSampleBufferではありません。次の回避策は、CVPixelBufferの位取りをCMSampleBufferから作成し、縮尺をCMSampleBufferからAVWriterに保存することです。サイズがCVPixelBufferの場合はAccelerate.frameworkを使用します。

3

返信が遅くなりました。しかし、私は将来の参照のために返信しています。 実際にあなたがコードで行ったことは、プレビューレイヤのズーム倍率を変更しただけで、基本的な出力接続は変更していないことです。しかし、ズームが最初にキャプチャされた出力に反映されるためには、ファクタを出力コネクションに配置する必要があります。次のようなものを使用できます。

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

これはすべきことです。

理想的には、あなたはあなたのSliderルーチンでconnection.videoScaleAndCropFactor変更を行うべきではないとだけcaptureStillImageAsynchronouslyFromConnectionメソッドを呼び出す前に、あなたの元の取得ルーチンにコードを配置し、スライダーの瞬間的な値で一度だけ、それを設定する必要があります。

はそれが役に立てば幸い:)

+0

'videoScaleAndCropFactor'を思い出させてくれてありがとう! – jianpx