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

相关推荐
柚鸥ASO优化11 小时前
一篇讲透安卓ASO!开发者千万别只盯着iOS了
android·ios·aso优化
黑科技iOS上架12 小时前
Swift Package Manager包管理工具的优缺点
经验分享·ios
大熊猫侯佩15 小时前
Swift 6.4 的 Ref / MutableRef 大揭秘:给值类型开一扇“安全的小窗”
ios·swift·编程语言
黑科技iOS上架16 小时前
没有mac电脑如何借助windows系统上传ipa到App Store
经验分享·ios
Layer17 小时前
从 WWDC 26 空间重构(Spatial Reframing)再看端侧 2D 转 3D 的技术演进
ios·aigc
Cutecat_1 天前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
大熊猫侯佩1 天前
WWDC26 SwiftUI 进化之路:砸碎黑盒,彻底迎来开发自由!
ios·swiftui·swift
游戏开发爱好者81 天前
iPhone真机调试有哪些方法?一次定位推送权限问题时整理出来的几种方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
大熊猫侯佩2 天前
WWDC26 最被忽视的王炸:告别“伪并发”陷阱,Swift 6.4 的 async defer
ios·swift·编程语言
h-189-53-6712072 天前
苹果开发者账号防关联3.2f隔离环境传包提审iOS开发上架的高效隔离方案:iOSUploader工具实用解析
ios·ios上架·ios审核·苹果审核·苹果开发者账号·苹果开发者封号