在 Swift 中组合 CGBitmapInfo 和 CGImageAlphaInfo
Combining CGBitmapInfo and CGImageAlphaInfo in 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)
这是在 Swift 中创建 bitmapInfo
的最简单方法吗?
你可以简单一点:
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)]
(或使用类似的内联方式。)这至少保留了信息的基本选项集。
我正在将 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
的最简单方法吗?
你可以简单一点:
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)]
(或使用类似的内联方式。)这至少保留了信息的基本选项集。