swift cgcontext

CGBitmapContextCreate error con swift



cgcontext (7)

Estoy tratando de crear un CGContext en swift. Se compila pero arroja un error en tiempo de ejecución.

let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() let context:CGContext = CGBitmapContextCreate(nil, 20, 20, 8, 0, colorSpace, CGBitmapInfo.AlphaInfoMask) CGColorSpaceRelease(colorSpace); ....

Y el error es:

Error: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; unrecognized; 96 bytes/row. fatal error: Can''t unwrap Optional.None


Actualizado para Swift 3:

let colorSpace = CGColorSpaceCreateDeviceRGB() let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) guard let context = CGContext.init(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: Int(bitsPerComponent), bytesPerRow: Int(bytesPerRow), space: colorSpace, bitmapInfo: UInt32(bitmapInfo.rawValue)) else { // cannot create context - handle error }


CGBitmapInfo.AlphaInfoMask no es una información de mapa de bits válida.

Intente configurar CGBitmapInfo.AlphaLast o CGBitmapInfo.AlphaFirst.


En Swift 2.1 se puede acceder a los campos correctamente, e incluso O juntos:

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue) let context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, bitmapInfo.rawValue);

Mucho de ''rawValue'' está pasando :)

Ni siquiera necesita separar bitmapInfo, y puede hacer una sola línea:

let context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue


En Swift 2.2:

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue).rawValue let colorSpace = CGColorSpaceCreateDeviceRGB() let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo)


Manera sugerida compatible con Xcode 8.3 y Xcode 9 que admite Swift 3 y Swift 4

let colorSpace = CGColorSpaceCreateDeviceRGB() guard let bitmapContext = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: Int(bitsPerComponent), bytesPerRow: Int(bytesPerRow), space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else { return nil }


Por si acaso alguien se encuentra con el mismo problema. El fragmento a continuación finalmente funciona.

let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue) let context = CGBitmapContextCreate(nil, UInt(rect.size.width), UInt(rect.size.height), 8, 0, colorSpace, bitmapInfo)

Genera un contexto RGBA de 32 bits en swift


Tuve algunos problemas en Swift 1.2 usando UInt , ahora estoy usando Int y está funcionando. Este ejemplo muestra cómo convertir una imagen en una imagen en escala de grises.

let imageRect = self.myImage.frame let colorSpace = CGColorSpaceCreateDeviceGray() let width = imageRect.width let height = imageRect.height let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.None.rawValue) let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo)