Объединение CGBitmapInfo и CGImageAlphaInfo в Swift

Я переписываю Apple UIImageEffects Пример кода от Objective-C до Swift, и у меня есть вопрос, касающийся следующей строки:

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

Вот моя версия в 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)

Это самый простой способ создать bitmapInfo в Свифте?

2 ответа

Решение

Вы можете сделать это немного проще:

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

Вы, к сожалению, не можете избежать преобразования CGImageAlphaInfo в CGBitmapInfo, Это просто слабость в текущем API. Но как только вы это сделаете, вы можете использовать .union объединить это с другими ценностями. И когда тип перечисления известен, вам не нужно повторять его.

Мне странно, что здесь нет доступных операторов. Я открыл для этого радар и включил | реализация. 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

Сейчас это не очень красиво, независимо от того, что вы делаете, но я думаю, что самый чистый стиль (начиная со Swift 4) - это использовать что-то вроде:

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

(Или используйте что-то похожее в строке.) Это, по крайней мере, сохраняет основные опции информации.

Другие вопросы по тегам