AVFoundation裁剪根据预览宽高比捕获静止图像

时间:2011-08-11 15:03:28

标签: objective-c ios ios4 avfoundation

我的问题大致与此相似:

Cropping image captured by AVCaptureSession

我有一个使用AVFoundation拍摄静止图像的应用程序。我的AVCaptureVideoPreviewLayer具有AVLayerVideoGravityResizeAspectFill视频重力,从而使得向用户显示的预览图片从顶部和底部部分被裁剪。

当用户按下“捕获”按钮时,实际捕获的图像与显示给用户的预览图像不同。我的问题是如何相应地裁剪拍摄的图像?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我使用了here中提供的UIImage+Resize类别,并使用了我编写的一些新方法来完成这项工作。我重新格式化了一些代码,看起来更好,没有经过测试,但它应该可行。 :))

- (UIImage*)cropAndResizeAspectFillWithSize:(CGSize)targetSize
                       interpolationQuality:(CGInterpolationQuality)quality {

    UIImage *outputImage = nil;
    UIImage *imageForProcessing = self;

    // crop center square (AspectFill)
    if (self.size.width != self.size.height) {
        CGFloat shorterLength = 0;
        CGPoint origin = CGPointZero;
        if (self.size.width > self.size.height) {
            origin.x = (self.size.width - self.size.height)/2;
            shorterLength = self.size.height;
        }
        else {
            origin.y = (self.size.height - self.size.width)/2;
            shorterLength = self.size.width;
        }
        imageForProcessing = [imageForProcessing normalizedImage];
        imageForProcessing = [imageForProcessing croppedImage:CGRectMake(origin.x, origin.y, shorterLength, shorterLength)];
    }
    outputImage = [imageForProcessing resizedImage:targetSize interpolationQuality:quality];
    return outputImage;
}

// fix image orientation, which may wrongly rotate the output.
- (UIImage *)normalizedImage {
    if (self.imageOrientation == UIImageOrientationUp) return self;

    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    [self drawInRect:(CGRect){0, 0, self.size}];
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return normalizedImage;
}