使用CGBitmapInfo和CGImageAlphaInfo进行按位操作

hpi*_*que 11 bit-manipulation core-graphics swift

我在使用Swift CGImageAlphaInfoCGBitmapInfo在Swift中执行按位操作时遇到了麻烦.

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

bitmapInfo &= ~kCGBitmapAlphaInfoMask;
bitmapInfo |= kCGImageAlphaNoneSkipFirst;
Run Code Online (Sandbox Code Playgroud)

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

bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGImageAlphaInfo.NoneSkipFirst
Run Code Online (Sandbox Code Playgroud)

看一下源代码,我注意到它CGBitmapInfo被声明为一段RawOptionSetType时间CGImageAlphaInfo不是.也许这与它有关?

关于按位运算符的官方文档不包含枚举,这没有任何帮助.

Nat*_*ook 10

你有正确的等效Swift代码:

bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
Run Code Online (Sandbox Code Playgroud)

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

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

我没有在其他地方看到像这样的枚举和位掩码,如果这解释了为什么没有真正的文档.既然CGImageAlphaInfo是枚举,它的价值是相互排斥的.这没有任何意义:

bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
Run Code Online (Sandbox Code Playgroud)

  • 这在swift 2.0中再次改变,现在使用OptionSetTypeProtocol.现在使用`var bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue:~CGBitmapInfo.AlphaInfoMask.rawValue | CGImageAlphaInfo.NoneSkipFirst.rawValue) (4认同)

Cod*_*rew 6

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

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue)
Run Code Online (Sandbox Code Playgroud)

您可以通过|操作员添加其他位图信息设置,例如

let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.first.rawValue)
Run Code Online (Sandbox Code Playgroud)