如何从 CGColorSpace 获得 Unmanaged<CGColorSpace>?

Posted

技术标签:

【中文标题】如何从 CGColorSpace 获得 Unmanaged<CGColorSpace>?【英文标题】:How do you get Unmanaged<CGColorSpace> from CGColorSpace? 【发布时间】:2015-02-06 08:29:43 【问题描述】:

我正在用 Swift 编写一个函数,它从 CGImage 创建一个 vImage_CGImageFormat,如下所示:

vImage_CGImageFormat(
    bitsPerComponent: UInt32(CGImageGetBitsPerComponent(image)), 
    bitsPerPixel: UInt32(CGImageGetBitsPerPixel(image)), 
    colorSpace: CGImageGetColorSpace(image), 
    bitmapInfo: CGImageGetBitmapInfo(image), 
    version: UInt32(0), 
    decode: CGImageGetDecode(image), 
    renderingIntent: CGImageGetRenderingIntent(image))

然而,这不会编译。这是因为CGImageGetColorSpace(image) 返回CGColorSpace! 而上面的构造函数只接受Unmanaged&lt;CGColorSpace&gt; 作为colorSpace 参数。

还有其他方法可以做到这一点吗?也许将CGColorSpace 转换为Unmanaged&lt;CGColorSpace&gt;

【问题讨论】:

【参考方案1】:

这应该可行:

vImage_CGImageFormat(
    // ...
    colorSpace: Unmanaged.passUnretained(CGImageGetColorSpace(image)),
    //...
)

来自struct Unmanaged&lt;T&gt; API 文档:

/// Create an unmanaged reference without performing an unbalanced
/// retain.
///
/// This is useful when passing a reference to an API which Swift
/// does not know the ownership rules for, but you know that the
/// API expects you to pass the object at +0.
///
/// ::
///
///   CFArraySetValueAtIndex(.passUnretained(array), i,
///                          .passUnretained(object))
static func passUnretained(value: T) -> Unmanaged<T>

Swift 3 更新:

vImage_CGImageFormat(
    // ...
    colorSpace: Unmanaged.passUnretained(image.colorSpace!),
    //...
)

【讨论】:

先生,君子,书生

以上是关于如何从 CGColorSpace 获得 Unmanaged<CGColorSpace>?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上的 CGColorSpace API 和颜色管理状态?

从 MTKView 创建的 UIImage 导致颜色/不透明度差异

数字色度计显示本机值的色彩空间是啥

如何从剑道组合框获得价值

如何获得进度对话框,直到从android中的服务获得响应?

如何从 PushSharp 中获得耐用性