首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用avfoundation时-裁剪显示层中表示的捕获图像的可见部分

使用avfoundation时-裁剪显示层中表示的捕获图像的可见部分
EN

Stack Overflow用户
提问于 2014-01-22 15:58:31
回答 1查看 1.7K关注 0票数 5

我正在使用PBJVision库来捕获图像。

在幕后,它使用的是AVFoundation。

我将摄像机设置为使用以下选项

代码语言:javascript
复制
    PBJVision *camera = [[PBJVision alloc] init];
    self.camera = camera;
    self.camera.delegate = self;
    [self.camera setCameraMode:PBJCameraModePhoto];
    [self.camera setCameraDevice:PBJCameraDeviceFront];
    [self.camera setCameraOrientation:PBJCameraOrientationPortrait];
    [self.camera setFocusMode:PBJFocusModeAutoFocus];
    [self.camera setPresentationFrame:self.previewView.frame];
    [self.camera previewLayer].frame = self.previewView.bounds;

    [self.camera previewLayer].videoGravity = AVLayerVideoGravityResizeAspectFill;

    [self.previewView.layer addSublayer:[self.camera previewLayer]];

由于预览层重力设置为AVLayerVideoGravityResizeAspectFill,因此捕获的图像与预览的图像不同。

如何根据视频重力进行裁剪?

EN

回答 1

Stack Overflow用户

发布于 2014-01-22 18:00:02

基于Erica Sadun的优秀Cookbook,将以下代码添加到视图控制器将允许您执行以下操作

UIImage *newImage = [self.applyAspectFillImage: image InRect: self.previewView.bounds];

您可以通过使用原始照片图像的较小边缘(宽或高)来调整目标矩形的大小,从而获得最大图像大小。

代码语言:javascript
复制
CGFloat scaleW = image.size.width / previewView.bounds.size.width;
CGRect destRect = CGRectMake(0, 0, image.size.width, preview.bounds.size.height * scaleW);
UIImage *newImage = [self.applyAspectFillImage: image InRect: destRect];

代码:

代码语言:javascript
复制
CGRect CGRectCenteredInRect(CGRect rect, CGRect mainRect)
{
    CGFloat xOffset = CGRectGetMidX(mainRect)-CGRectGetMidX(rect);
    CGFloat yOffset = CGRectGetMidY(mainRect)-CGRectGetMidY(rect);
    return CGRectOffset(rect, xOffset, yOffset);
}


// Calculate the destination scale for filling
CGFloat CGAspectScaleFill(CGSize sourceSize, CGRect destRect)
{
    CGSize destSize = destRect.size;
    CGFloat scaleW = destSize.width / sourceSize.width;
    CGFloat scaleH = destSize.height / sourceSize.height;
    return MAX(scaleW, scaleH);
}


CGRect CGRectAspectFillRect(CGSize sourceSize, CGRect destRect)
{
    CGSize destSize = destRect.size;
    CGFloat destScale = CGAspectScaleFill(sourceSize, destRect);
    CGFloat newWidth = sourceSize.width * destScale;
    CGFloat newHeight = sourceSize.height * destScale;
    CGFloat dWidth = ((destSize.width - newWidth) / 2.0f);
    CGFloat dHeight = ((destSize.height - newHeight) / 2.0f);
    CGRect rect = CGRectMake (dWidth, dHeight, newWidth, newHeight);
    return rect;
}



- (UIImage *) applyAspectFillImage: (UIImage *) image InRect: (CGRect) bounds
{
    CGRect destRect;

    UIGraphicsBeginImageContext(bounds.size);
    CGRect rect = CGRectAspectFillRect(image.size, bounds);
    destRect = CGRectCenteredInRect(rect, bounds);

    [image drawInRect: destRect];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21277224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档