我想使用 UISlider 缩放相机。
我通过调整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];
}
但是当我捕获它时,我得到的是非缩放的图像对象。
最佳答案
回复有点晚了。但我正在回复以备将来引用。 实际上,您在代码中所做的只是更改了预览层的缩放系数,而不是底层输出连接。但是要使缩放最初反射(reflect)在捕获的输出上,您还必须将这个因素也放在输出连接中。您可以使用类似于以下内容的内容:
-(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
更改,而应将代码放在原始捕获例程中,并使用 slider 的瞬时值,就在调用 captureStillImageAsynchronouslyFromConnection
方法之前。
希望对您有所帮助:)
关于iphone - 想要使用 AVFoundation 框架在 iPhone 相机中使用缩放功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17564536/