2015-11-12 14 views
8

che sto riscrivendo il codice UIImageEffects di esempio di Apple da Objective-C a Swift e ho una domanda per quanto riguarda la seguente riga:Combinando CGBitmapInfo e CGImageAlphaInfo a Swift

vImage_CGImageFormat format = { 
    .bitsPerComponent = 8, 
    .bitsPerPixel = 32, 
    .colorSpace = NULL, 
    .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, 
    .version = 0, 
    .decode = NULL, 
    .renderingIntent = kCGRenderingIntentDefault 
}; 

Ecco la mia versione di Swift:

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue) 
let format = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: bitmapInfo, version: 0, decode: nil, renderingIntent: .RenderingIntentDefault) 

È questo il modo più semplice di creare bitmapInfo in Swift?

risposta

5

Si può rendere un po 'più semplice:

let bimapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue) 
    .union(.ByteOrder32Little) 

È purtroppo non riesce a liberarsi di conversione del CGImageAlphaInfo in un CGBitmapInfo. Questo è solo un punto debole nell'API corrente. Ma una volta che hai, puoi usare .union per combinarlo con altri valori. E una volta che il tipo enum è noto, non devi continuare a ripeterlo.

È strano per me che non ci sia operatore disponibile qui. Ho aperto un radar per questo e ho incluso un'implementazione |. http://www.openradar.me/23516367

public func |<T: SetAlgebraType>(lhs: T, rhs: T) -> T { 
    return lhs.union(rhs) 
} 

@warn_unused_result 
public func |=<T : SetAlgebraType>(inout lhs: T, rhs: T) { 
    lhs.unionInPlace(rhs) 
} 

let bimapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue) 
    | .ByteOrder32Little 
+3

Non c'è operatore perché Swift vuole che tu pensi a questi come raccolte (quindi le operazioni di bit sono una specie di dettaglio di implementazione). La sintassi preferita utilizza un letterale di array: 'let bimapInfo: CGBitmapInfo = [CGBitmapInfo (rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue), .ByteOrder32Little]'. –

1

non è abbastanza in questo momento, non importa quello che fai, ma penso che lo stile più pulito (come di Swift 4) è quello di utilizzare qualcosa come:

let bimapInfo: CGBitmapInfo = [ 
     .byteOrder32Little, 
     .floatComponents, 
     CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)] 

(O usare qualcosa di simile in linea .) Questo almeno conserva l'essenziale set di opzioni delle informazioni.

Problemi correlati