CGBitmapInfo快速2.0后的alpha蒙版

我正在使用这个github仓库https://github.com/Haneke/HanekeSwift来caching从服务器下载的图像。 更新到swift 2.0后,一切都搞砸了。

我已经能够修复一切,但这个function:

func hnk_decompressedImage() -> UIImage! { let originalImageRef = self.CGImage let originalBitmapInfo = CGImageGetBitmapInfo(originalImageRef) let alphaInfo = CGImageGetAlphaInfo(originalImageRef) // See: http://stackoverflow.com/questions/23723564/which-cgimagealphainfo-should-we-use var bitmapInfo = originalBitmapInfo switch (alphaInfo) { case .None: bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask bitmapInfo |= CGBitmapInfo(rawValue: CGImageAlphaInfo.NoneSkipFirst.rawValue) case .PremultipliedFirst, .PremultipliedLast, .NoneSkipFirst, .NoneSkipLast: break case .Only, .Last, .First: // Unsupported return self } let colorSpace = CGColorSpaceCreateDeviceRGB() let pixelSize = CGSizeMake(self.size.width * self.scale, self.size.height * self.scale) if let context = CGBitmapContextCreate(nil, Int(ceil(pixelSize.width)), Int(ceil(pixelSize.height)), CGImageGetBitsPerComponent(originalImageRef), 0, colorSpace, bitmapInfo) { let imageRect = CGRectMake(0, 0, pixelSize.width, pixelSize.height) UIGraphicsPushContext(context) // Flip coordinate system. See: http://stackoverflow.com/questions/506622/cgcontextdrawimage-draws-image-upside-down-when-passed-uiimage-cgimage CGContextTranslateCTM(context, 0, pixelSize.height) CGContextScaleCTM(context, 1.0, -1.0) // UIImage and drawInRect takes into account image orientation, unlike CGContextDrawImage. self.drawInRect(imageRect) UIGraphicsPopContext() let decompressedImageRef = CGBitmapContextCreateImage(context) let scale = UIScreen.mainScreen().scale let image = UIImage(CGImage: decompressedImageRef, scale:scale, orientation:UIImageOrientation.Up) return image } else { return self } } 

具体来说,这是抛出错误的代码行:

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

错误:一元运算符'〜'不能应用于CGBitmapInfotypes的操作数

 bitmapInfo |= CGBitmapInfo(rawValue: CGImageAlphaInfo.NoneSkipFirst.rawValue) 

错误:二进制运算符'| ='不能应用于'CGBitmapInfo'types的操作数

 if let context = CGBitmapContextCreate(nil, Int(ceil(pixelSize.width)), Int(ceil(pixelSize.height)), CGImageGetBitsPerComponent(originalImageRef), 0, colorSpace, bitmapInfo) 

错误:无法将types“CGBitmapInfo”的值转换为types为UInt32的预期参数

错误:无法将types“CGBitmapInfo”的值转换为types为UInt32的预期参数

Swift 2.0实际上需要一个UInt32而不是一个CGBitMapInfo对象,所以你应该在CGBitMapInfo中取出一个UInt32variables。

 CGBitmapContextCreate( nil, Int(ceil(pixelSize.width)), Int(ceil(pixelSize.height)), CGImageGetBitsPerComponent(originalImageRef), 0, colorSpace, bitmapInfo.rawValue) 

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGBitmapContext/#//apple_ref/c/func/CGBitmapContextCreate

OptionSetType在Swift 2中,CGBitmapInfo是一个OptionSetType。 初始化一个你可以按照惯例

 /// static let Box = PackagingOptions(rawValue: 1) /// static let Carton = PackagingOptions(rawValue: 2) /// static let Bag = PackagingOptions(rawValue: 4) /// static let Satchel = PackagingOptions(rawValue: 8) /// static let BoxOrBag: PackagingOptions = [Box, Bag] /// static let BoxOrCartonOrBag: PackagingOptions = [Box, Carton, Bag] 

在CGBitmapInfo的情况下,它是一个OptionSetTypes的OptionSetType

 public enum CGImageAlphaInfo : UInt32 { case None /* For example, RGB. */ case PremultipliedLast /* For example, premultiplied RGBA */ case PremultipliedFirst /* For example, premultiplied ARGB */ case Last /* For example, non-premultiplied RGBA */ case First /* For example, non-premultiplied ARGB */ case NoneSkipLast /* For example, RBGX. */ case NoneSkipFirst /* For example, XRGB. */ case Only /* No color data, alpha data only */ } @available(iOS 2.0, *) public struct CGBitmapInfo : OptionSetType { public init(rawValue: UInt32) public static var AlphaInfoMask: CGBitmapInfo { get } public static var FloatComponents: CGBitmapInfo { get } public static var ByteOrderMask: CGBitmapInfo { get } public static var ByteOrderDefault: CGBitmapInfo { get } public static var ByteOrder16Little: CGBitmapInfo { get } public static var ByteOrder32Little: CGBitmapInfo { get } public static var ByteOrder16Big: CGBitmapInfo { get } public static var ByteOrder32Big: CGBitmapInfo { get } } 

如何用字节顺序和alpha掩码设置来初始化它的一个例子:

  let bitmapInfo:CGBitmapInfo = [.ByteOrder32Little, CGBitmapInfo(rawValue: ~CGBitmapInfo.AlphaInfoMask.rawValue | CGImageAlphaInfo.PremultipliedFirst.rawValue)] 

相关的问题,答案和评论