使用CGBitmapInfo和CGImageAlphaInfo进行按位操作

时间:2014-09-10 19:19:07

标签: swift core-graphics bit-manipulation

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

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

bitmapInfo &= ~kCGBitmapAlphaInfoMask;
bitmapInfo |= kCGImageAlphaNoneSkipFirst;

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

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

查看源代码时,我注意到CGBitmapInfo被声明为RawOptionSetTypeCGImageAlphaInfo未被声明为{{1}}。也许这与它有关?

关于按位运算符的官方文档没有涵盖枚举,这没有任何帮助。

3 个答案:

答案 0 :(得分:10)

你有正确的等效Swift代码:

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

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

实际发生的是你的第一行清除了uint32_t的前五位,其中 是一个位掩码(在Swift中又名bitmapInfo),因为RawOptionSetType是31或0b11111。然后你的第二行将CGBitmapInfo.AlphaInfoMask enum的原始值粘贴到那些清除的位中。

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

CGImageAlphaInfo

答案 1 :(得分:6)

从Swift 3,Xcode 8 Beta 5开始,语法(如JackPearse指出,它符合OptionSetType协议)再次更改,我们不再需要let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue) ,而只需使用

|

您可以通过let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.first.rawValue) 运算符添加其他位图信息设置,例如

// pseudo-code -- make this test for every non-dragging orb
var dx=mouseX-orb[n].x;
var dy=mouseY-orb[n].y; 
if(dx*dx+dy*dy<orb[n].radius){
    // change orb[n]'s x,y to the dragging orb's x,y (and optionally re-render)
}

答案 2 :(得分:1)

事实证明,CGImageAlphaInfo值需要转换为CGBitmapInfo才能执行按位运算。这可以这样做:

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