簡體   English   中英

使用avfoundation時 - 裁剪在顯示層中表示的捕獲圖像的可見部分

[英]When using avfoundation - crop visible portion of captured image represented in display layer

我正在使用PBJVision庫來捕獲圖像。

在引擎蓋下,它正在使用AVFoundation。

我將相機設置為使用以下選項

    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所捕獲的圖像與預覽圖像不同。

如何根據視頻重力裁剪它?

基於Erica Sadun的優秀Cookbook,將以下代碼添加到您的視圖控制器將允許您這樣做
UIImage *newImage = [self.applyAspectFillImage: image InRect: self.previewView.bounds];

您可以使用原始照片圖像的較小邊緣(寬度或高度)來獲取最大圖像大小,以調整目標矩形的大小。

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

編碼:

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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM