iOS 腾讯Pag动画框架-实现PagView的截图功能

背景

产品想要一个首页的截图功能,一听这个功能,心想那还不简单,将父视图控件转换成图片保存就行了。按照这个思路实现,很快就打脸啦,首页的这些动画一个都没有截出来,就像消失啦似的。然后蠢蠢的将动画暂停再截图,还是截不下这些动画,项目中用来显示动画的框架是腾讯的PAG框架,用的是框架中的pagView控件来加载显示动画。认真翻看了pag文档,硬是没找到截图的接口。那么pagView如何才能实现截图的功能呢?

了解PAG框架

PAG(Portable Animated Graphics) 是一套完整的动效工作流解决方案。

目标是降低或消除动效相关的研发成本,能够一键将设计师在 AE(Adobe After Effects)中制作的动效内容导出成素材文件,并快速上线应用于几乎所有的主流平台。

PAG官网

PagView 实现截图功能

在论坛里终于让我找到了如何实现截图的方法,但是知道了又好像不知道,这个方法看着有点懵,一起来看看吧!

根据目前的信息要实现截图功能,首先我们需要通过makesnapshot 方法来获取我们能操作的CVPixelBuffer对象,然后看看能不能将CVPixelBuffer对象转换成UIimage对象

获取CVPixelBuffer

复制代码
let snapshot: Unmanaged<CVPixelBuffer>? = self.pagView.makeSnapshot()
        
        //takeUnretainedValue 返回被管理的对象的非保留值,也就是将其转换为常规的对象
        if  let bufferRef = snapshot?.takeUnretainedValue() {
            if  let image = UIImageTool.getImageFromPixelBuffer(pixelBuffer: bufferRef ) {
                self.imageView.image = image
            }
        }else {
            YLLog("nil bufferRef")
        }

CVPixelBuffer 转 UIImage

复制代码
  ///CVPixelBufferRef 转换为 UIImage
    static func getImageFromPixelBuffer(pixelBuffer: CVPixelBuffer) -> UIImage? {
        CVPixelBufferLockBaseAddress(pixelBuffer, .readOnly)
        
        let baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer)
        let width = CVPixelBufferGetWidth(pixelBuffer)
        let height = CVPixelBufferGetHeight(pixelBuffer)
        let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        
        let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue)
        
        guard let context = CGContext(data: baseAddress, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) else {
            CVPixelBufferUnlockBaseAddress(pixelBuffer, .readOnly)
            return nil
        }
        
        guard let cgImage = context.makeImage() else {
            CVPixelBufferUnlockBaseAddress(pixelBuffer, .readOnly)
            return nil
        }
        
        let image = UIImage(cgImage: cgImage)
        
        CVPixelBufferUnlockBaseAddress(pixelBuffer, .readOnly)
        
        return image
    }

结语

在实现pagview截图功能的时候,刚开始是一头雾水,网上搜也搜不到,官方文档也没有说明,再问了同行兄弟也没结果,最后只剩一个地方官方论坛,幸好有老兄在论坛里提了一下用makesnapshot方法可以实现,于是我便顺着这条线索,实现了这个功能。


感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!

相关推荐
Digitally1 天前
如何安全轻松地出售损坏的 iPhone(最新指南)
安全·ios·iphone
怪力左手1 天前
地图下载工具
开发语言·ios·swift
他们都不看好你,偏偏你最不争气1 天前
【iOS】KVC总结
macos·ios·objective-c·cocoa·kvc
YGGP1 天前
【Swift】LeetCode 15. 三数之和
swift
Muen2 天前
Swift-SOLID编程原则的实践
ios
HarderCoder2 天前
Swift 6.2 类型安全 NotificationCenter:告别字符串撞车
swift
HarderCoder2 天前
Swift 控制流深度解析(一):循环、条件与分支
swift
HarderCoder2 天前
Swift 控制流深度解析(二):模式匹配、并发与真实项目套路
swift
猪哥帅过吴彦祖2 天前
Flutter 系列教程:常用基础组件 (下) - `TextField` 和 `Form`
前端·flutter·ios
Digitally2 天前
从iPhone转移到itel手机的联系人转移指南
ios·智能手机·iphone