2015-09-17 15 views
13

このgithub repo https://github.com/Haneke/HanekeSwiftのライブラリを使用して、サーバーからダウンロードされているイメージをキャッシュしています。 swift 2.0にアップデートした後は、すべてがうんざりです。 「〜」単項演算子:swift後のCGBitmapInfoアルファマスク

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

エラー:具体的に

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 
    } 
} 

これはエラーを投げているコードの行は、次のとおりです。

私はこの機能以外のすべてを修正することができましたCGBitmapInfo

タイプのオペランドに適用することはできません
bitmapInfo |= CGBitmapInfo(rawValue: CGImageAlphaInfo.NoneSkipFirst.rawValue) 

エラー:バイナリ演算子「| =」にすることはできませんタイプのオペランド「CGBitmapInfo」

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

エラーに適用される:タイプUInt32型

答えて

22

エラーの予想引数に型「CGBitmapInfo」の値を変換できません:の予想引数に型「CGBitmapInfo」の値を変換できません。タイプUInt32

Swift 2.0では実際にCGBitMapInfoオブジェクトの代わりにUInt32が必要なので、CGBitMapInfoのUInt32変数を取り出す必要があります。 SWIFT 2 CGBitmapInfoで

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

3

OptionSetType OptionSetTypeあります。 1を初期化するにはCGBitmapInfo、OptionSetTypes

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 } 
} 

バイト順とアルファマスクの設定でそれを初期化する方法の一例のそのOptionSetTypeの場合

​​

規則に従うことができます。

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

related question, answer and comment

関連する問題