我正在将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)
这是在Swift中创建bitmapInfo
的最简单方法吗?
答案 0 :(得分:8)
你可以让它变得更简单:
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
答案 1 :(得分:2)
不管你做什么,它现在都不是很好,但我认为最干净的风格(如Swift 4)是使用类似的东西:
let bitmapInfo: CGBitmapInfo = [
.byteOrder32Little,
.floatComponents,
CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)]
(或使用类似内联的东西。)这至少保留了信息的基本选项集。