2014-06-08 4 views
25

Я пытаюсь создать CGContext в swift. Он компилируется, но выдает ошибку во время выполнения.CGBitmapContextCreate error with swift

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

.... 

И ошибка:

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 

ответ

56

На всякий случай кто-то сталкивается с той же проблемой. Ниже снимок внизу работает.

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) 

Он генерирует 32 битную контекст RGBA в быстрой

+6

С текущей версией Swift (Я использую Xcode 6.1): let bitmapInfo = CGBitmapInfo (CGImageAlphaInfo.PremultipliedLast.rawValue) –

+0

@RyanH. - Спасибо - я собираюсь отредактировать это в ответ – Robert

+4

И с текущей версией Xcode теперь: let context = CGBitmapContextCreate (nil, Int (rect.size.width), Int (rect.size.height), 8, 0, colorSpace, bitmapInfo) –

0

CGBitmapInfo.AlphaInfoMask не является допустимой информацией растровой.

Попробуйте установить CGBitmapInfo.AlphaLast или CGBitmapInfo.AlphaFirst.

+0

Это не компилируется, и я не могу найти CGBitmapInfo.AlphaLast или CGBitmapInfo.AlphaFirst в https://developer.apple.com/library/prerelease/ios/documentation/GraphicsImaging/Reference/CGBitmapContext/index.html#//apple_ref/c/func/CGBitmapContextCreate – loopmasta

3

У меня были некоторые проблемы в Swift 1.2 с помощью UInt, теперь я использую Int, и это работает. В этом примере показано, как преобразовать изображение в полутоновое изображение.

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) 
10

В Swift 2.1 можно получить доступ к полям правильно, и даже OR их вместе:

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue) 

let context = CGBitmapContextCreate(baseAddress, width, height, 8, 
       bytesPerRow, colorSpace, bitmapInfo.rawValue); 

Всего много 'RawValue' происходит :)

Вам даже не нужно чтобы выделить BITMAPINFO, и может сделать один-лайнер:

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

в 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) 
14

Обновление для 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 
    } 
2

Предлагаемый способ совместим как с Xcode 8.3 и Xcode 9, который поддерживает Swift 3 и 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 
    }