【问题标题】:Bitwise operations with CGBitmapInfo and CGImageAlphaInfo使用 CGBitmapInfo 和 CGI​​mageAlphaInfo 进行位运算
【发布时间】:2014-09-10 19:19:07
【问题描述】:

我在 Swift 中使用 CGImageAlphaInfoCGBitmapInfo 执行按位运算时遇到问题。

特别是,我不知道如何移植这段 Objective-C 代码:

bitmapInfo &= ~kCGBitmapAlphaInfoMask;
bitmapInfo |= kCGImageAlphaNoneSkipFirst;

以下简单的 Swift 端口在最后一行产生了有点神秘的编译器错误'CGBitmapInfo' is not identical to 'Bool'

bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGImageAlphaInfo.NoneSkipFirst

查看源代码我注意到CGBitmapInfo 被声明为RawOptionSetTypeCGImageAlphaInfo 不是。也许这与它有关?

有关位运算符的官方文档没有涵盖枚举,这无济于事。

【问题讨论】:

    标签: swift core-graphics bit-manipulation


    【解决方案1】:

    你有正确的等效 Swift 代码:

    bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
    bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
    

    这有点奇怪,因为CGImageAlphaInfo 实际上不是位掩码——它只是一个 UInt32 enum(或 C 语言中类型为 uint32_t 的 CF_ENUM/NS_ENUM),其值为 0 到 7。

    实际发生的情况是,您的第一行清除了 bitmapInfo 的前五位,这位掩码(在 Swift 中也称为 RawOptionSetType),因为 CGBitmapInfo.AlphaInfoMask 是 31,或 0b11111 .然后你的第二行将CGImageAlphaInfo 枚举的原始值粘贴到那些清除的位中。

    我还没有在其他任何地方看到像这样组合的枚举和位掩码,如果这解释了为什么没有真正的文档。由于CGImageAlphaInfo 是一个枚举,它的值是互斥的。这没有任何意义:

    bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
    bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
    bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
    

    【讨论】:

    • 这在 swift 2.0 中再次改变,现在使用 OptionSetTypeProtocol。现在使用var bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: ~CGBitmapInfo.AlphaInfoMask.rawValue | CGImageAlphaInfo.NoneSkipFirst.rawValue)
    【解决方案2】:

    从 Swift 3、Xcode 8 Beta 5 开始,语法(正如 JackPearse 指出的,它符合 OptionSetType 协议)再次更改,我们不再需要 ~CGBitmapInfo.AlphaInfoMask.rawValue,而是只使用

    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue)
    

    您可以通过| 运算符添加其他位图信息设置,例如

    let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.first.rawValue)
    

    【讨论】:

      【解决方案3】:

      原来CGImageAlphaInfo 值需要转换为CGBitmapInfo 才能执行按位运算。可以这样做:

      bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
      bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多