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

相关推荐
crasowas9 小时前
iOS - 超好用的隐私清单修复脚本(持续更新)
ios·app store
ii_best11 小时前
ios按键精灵脚本开发:ios悬浮窗命令
ios
Code&Ocean16 小时前
iOS从Matter的设备认证证书中获取VID和PID
ios·matter·chip
/**书香门第*/16 小时前
Laya ios接入goole广告,开始接入 2
ios
东坡肘子17 小时前
肘子的 Swift 周报 #063|异种肾脏移植取得突破
swiftui·swift·apple
恋猫de小郭1 天前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
flutter·ios·swiftui
网安墨雨1 天前
iOS应用网络安全之HTTPS
web安全·ios·https
威化饼的一隅1 天前
【多模态】swift-3框架使用
人工智能·深度学习·大模型·swift·多模态
福大大架构师每日一题2 天前
37.1 prometheus管理接口源码讲解
ios·iphone·prometheus
BangRaJun2 天前
LNCollectionView-替换幂率流体
算法·ios·设计