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

相关推荐
桃子叔叔12 小时前
基于SWIFT框架的预训练微调和推理实战指南之完整实战项目
大模型·swift
菜的不敢吱声12 小时前
swift学习第5天
学习·ssh·swift
符哥200814 小时前
Swift开发app常见第三方库
学习·swift
ii_best16 小时前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
先飞的笨鸟18 小时前
2026 年 Expo + React Native 项目接入微信分享完整指南
前端·ios·app
初级代码游戏18 小时前
iOS开发 SwiftUI 5 : 文本输入 密码输入 多行输入
ios·swiftui·swift
iosTiov19 小时前
ios生态的分发密钥:企业签、V3签、TF签深度解析与选型指南
安全·ios·团队开发·苹果签名·稳定
00后程序员张20 小时前
在 iPhone 上进行 iOS 网络抓包的实践经验
android·ios·小程序·https·uni-app·iphone·webview
2501_9159184120 小时前
介绍如何在电脑上查看 iPhone 和 iPad 的完整设备信息
android·ios·小程序·uni-app·电脑·iphone·ipad
晨枫阳20 小时前
iOS Universal Links配置
ios