2013-07-10 40 views
6

Tôi muốn phóng to máy ảnh bằng cách sử dụng UISlider.muốn phóng to chức năng trong máy ảnh iphone bằng cách sử dụng khung AVFoundation

Tôi đã thực hiện nó thành công bằng cách điều chỉnh AffineTransform của AVCaptureVideoPreviewLayer.

Đây là mã của nó

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

nhưng khi tôi nắm bắt nó, tôi nhận được đối tượng không thu nhỏ của hình ảnh.

+0

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html....pls kiểm tra xem nó thân hoặc http : //stackoverflow.com/questions/5794892/custom-camera-zoom-functionality-on-iphone – Anjaneyulu

+0

áp dụng cùng một biến đổi cho hình ảnh bạn đã chụp có lẽ? – marko

Trả lời

0

Đầu tiên mã của bạn chỉ phóng to nội dung lớp không CMSampleBuffer. Công việc tiếp theo của bạn là thực hiện thang tỷ lệ trên CVPixelBuffer từ CMSampleBuffer và lưu tỷ lệ CMSampleBuffer thành AVWriter. Bạn có thể sử dụng Accelerate.framework để chia tỷ lệ CVPixelBuffer.

3

Hơi muộn để trả lời. Nhưng tôi đang trả lời để tham khảo trong tương lai. Thực tế những gì bạn đã làm trong mã của bạn chỉ là bạn đã thay đổi hệ số thu phóng của lớp xem trước chứ không phải kết nối đầu ra cơ bản. Nhưng để thu phóng ban đầu được phản ánh trên đầu ra đã chụp, bạn cũng phải đặt yếu tố trong kết nối đầu ra của mình. Bạn có thể sử dụng một cái gì đó tương tự như dưới đây:

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

Và nó sẽ làm điều này.

Tốt nhất, bạn không nên thực hiện các thay đổi connection.videoScaleAndCropFactor trong Slider thói quen của bạn và nên đặt mã trong thói quen chụp ban đầu của bạn và đặt nó chỉ một lần với giá trị tạm thời của thanh trượt, ngay trước khi gọi captureStillImageAsynchronouslyFromConnection phương pháp.

Hy vọng nó sẽ giúp :)

+0

Nhờ lời nhắc của bạn về 'videoScaleAndCropFactor'! – jianpx