gpt4 book ai didi

ios - 如何缩放 CALayer 以适应视频层

转载 作者:搜寻专家 更新时间:2023-10-31 22:46:18 26 4
gpt4 key购买 nike

我对 CALayer 有疑问。关键是我想在电影中保存几个 UIView。基本上我正在尝试通过 CALayer 来完成。一切正常,应用程序导出带有图层的电影,但带有 View 的图层小于视频帧。

我尝试手动缩放图层,但在屏幕上看起来完全不像。如果我在电影中将 UIView 移得更高,它会更高。

视频具有全高清帧和 UIView 层取决于用户如何将其放置在屏幕上。

问题是:- 如何以更好的视网膜质量渲染 UIView 上下文?

  • 如何缩放图层以完美适合视频。

有代码:

VideoSaver.saveVideo(videoAsset!) { (composition, size) in
////////////////
//Parent Layer//
////////////////

let parentLayer = CALayer()
parentLayer.frame = CGRectMake(0, 0, size.width, size.height)

/////////
//Sizes//
/////////
let xScaleValue = CGRectGetWidth(parentLayer.frame)/CGRectGetWidth(self.view.frame)
let yScaleValue = CGRectGetHeight(parentLayer.frame)/CGRectGetHeight(self.view.frame)

///////////////
//Video Layer//
///////////////
let videoLayer = CALayer()
videoLayer.frame = CGRectMake(0, 0, size.width, size.height)

//////////////////
//Captions Layer//
//////////////////

//Creating UIImage from Captions
UIGraphicsBeginImageContext(CGSizeMake(self.captionsTextView.bounds.size.width, self.captionsTextView.bounds.size.height+20))
let currentContext = UIGraphicsGetCurrentContext()

CGContextTranslateCTM(currentContext, 0, 16)

self.captionsTextView.layer.renderInContext(currentContext!)
let captionTextViewImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

let captionsOverlayLayer = CALayer()
captionsOverlayLayer.contents = captionTextViewImage.CGImage
captionsOverlayLayer.frame = CGRectMake(self.captionsTextView.frame.origin.x * xScaleValue,
(size.height - ((self.captionsTextView.frame.origin.y - 20) * yScaleValue)),
CGRectGetWidth(self.captionsTextView.frame) * xScaleValue,
(CGRectGetHeight(self.captionsTextView.frame)+20) * yScaleValue)

captionsOverlayLayer.masksToBounds = true

///////////////////
//TagFilter Layer//
///////////////////
UIGraphicsBeginImageContext(self.tagView.bounds.size)
self.tagView.layer.renderInContext(UIGraphicsGetCurrentContext()!)

let tagViewImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

let tagOverlayLayer = CALayer()
tagOverlayLayer.contents = tagViewImage.CGImage
tagOverlayLayer.frame = CGRectMake(self.tagView.frame.origin.x * xScaleValue,
(size.height - ((self.tagView.frame.origin.y) * yScaleValue)),
CGRectGetWidth(self.tagView.frame) * xScaleValue,
(CGRectGetHeight(self.tagView.frame)) * yScaleValue)
///////////////////////////////////////////////

parentLayer.addSublayer(videoLayer)
parentLayer.addSublayer(captionsOverlayLayer)
parentLayer.addSublayer(tagOverlayLayer)

///////////////
//Composition//
///////////////
composition.animationTool = AVVideoCompositionCoreAnimationTool.init(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)
}

我很乐意提供帮助:)

最佳答案

如果问题是图层显示的图像分辨率,则:

  • 这是您的第一个错误:UIGraphicsBeginImageContext。始终调用 UIGraphicsBeginImageContextWithOptions0 的第三个参数,或显式解析。

  • 您的第二个错误是您从未设置 CALayer 的 contentsScale

关于ios - 如何缩放 CALayer 以适应视频层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37550294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com