【发布时间】:2020-11-10 13:44:24
【问题描述】:
在生成CGImage 时,可以在使用JPEG 编码数据、PNG 编码数据或仅数据的初始化程序之间进行选择。我正在从包含 16 位灰度值的 Data 对象生成图像。
初始化程序需要一个CGDataProvider,它可以是顺序访问或直接访问数据提供程序。
在顺序访问下,我们只有一个初始化器:
- 创建顺序访问数据提供程序
在 Direct-Access 下,我们有多个初始化器,但让我们关注一个子集:
- 创建直接访问数据提供者
- 创建使用程序提供的数据的直接访问数据提供程序
- 创建从 CFData 对象读取的数据提供程序
我们可以肯定地注意到,直接访问列表中的最后一项在其定义中缺少“直接访问”术语。
第一个问题: 我理解顺序和直接访问内存的概念,但是考虑到 Swift 的行为,有人能给我一个更准确的定义吗?
让我们继续。
我的UIViewController 子类中有两个不同的Data 对象。
我正在从主调度队列调用我在助手类中的静态函数。
这个辅助函数获取Data,这是我创建CGImage 并将其返回给视图控制器的地方。
视图控制器将每个图像保存在一个单独的属性变量中。
这就是事情变得奇怪的地方:
使用“创建从 CFData 对象读取的数据提供程序” - 有效!
但我不想在 iOS 项目中使用 CoreFoundation 并创建一个 CFData 对象(这可能会将缓冲区复制到一个新对象中)
使用“创建一个使用您的程序提供的数据的直接访问数据提供程序” - 有效!
我正在使用withUnsafeBytes 访问原始缓冲区,它在闭包内为我提供了UnsafeRawBufferPointer。
但是,如果我使用 withUnsafeMutableBytes 更改对 Data 的访问 - 返回到视图控制器的第二个图像会覆盖第一个图像!
我尝试使用 XCode 对其进行调试,并且每个图像实际上都是在辅助函数内部适当生成的,但是当第二个图像返回到视图控制器时,第一个图像发生了变化。
第二个问题: 什么会造成这种奇怪的行为?
这个过程有很多参与者,我想我已尽我所能尝试解决它。 任何反馈将不胜感激。
【问题讨论】:
标签: core-graphics swift5 ios14 cgimage unsafe-pointers