невозможно получить действительный CGContext при использовании любого цветового пространства RGB? - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь создать CGContext, в котором я могу нарисовать изображение, чтобы получить необработанные данные пикселей для последующей обработки.Я создаю CGContext, используя цветовое пространство, зависящее от изображения, которое я обрабатываю.Это прекрасно работает, когда я использую цветовое пространство в градациях серого или CMYK, но я не могу получить действительный CGContext при работе с любым цветовым пространством RGB.Приведенные ниже фрагменты иллюстрируют поведение, которое я вижу (в Swift 4, XCode 10.1).Я должен упустить что-то очевидное, но для жизни я не могу найти это.Любая помощь будет принята с благодарностью!

//let colorSpace3:CGColorSpace = CGColorSpaceCreateDeviceGray() // get good context
//let colorSpace3:CGColorSpace = CGColorSpaceCreateDeviceCMYK() // get good context
//let colorSpace3: CGColorSpace = CGColorSpace(name: CGColorSpace.linearGray)! // get good context
//let colorSpace3: CGColorSpace = CGColorSpace(name: CGColorSpace.genericCMYK)! // get good context
//let colorSpace3:CGColorSpace = CGColorSpaceCreateDeviceRGB() //context3 is nil
//let colorSpace3: CGColorSpace = CGColorSpace(name: CGColorSpace.sRGB)! //context3 is nil
//let colorSpace3: CGColorSpace = CGColorSpace(name: CGColorSpace.linearSRGB)! // context3 is nil
let colorSpace3: CGColorSpace = CGColorSpace(name: CGColorSpace.adobeRGB1998)! // context3 is nil

let bmpinfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue) // bmpinfo different settings doesn't change behavior

let context3 = CGContext(data: nil, width: 256, height: 256, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace3, bitmapInfo: bmpinfo.rawValue)

print(context3) // prints nil whenever colorSpace3 is an RGB space??

1 Ответ

0 голосов
/ 04 марта 2019

Вы должны увидеть CGBitmapContextCreate: unsupported parameter combination в консоли.Просто измените

let bmpinfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue)

на

let bmpinfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)

, и все будет хорошо.Пример:

let colorSpace3: CGColorSpace = CGColorSpace(name: CGColorSpace.sRGB)!
let bmpinfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
let context3 = CGContext(data: nil, width: 256, height: 256, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace3, bitmapInfo: bmpinfo.rawValue)!
print(context3)

Отпечатки:

<CGContext 0x600000165580> (kCGContextTypeBitmap)
    <<CGColorSpace 0x60000022a9c0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
        width = 256, height = 256, bpc = 8, bpp = 32, row bytes = 1024 
        kCGImageAlphaPremultipliedLast | 0 (default byte order) 

Кстати, ваш маленький танец обращения не нужен.Вы можете просто установить bmpInfo на CGImageAlphaInfo.premultipliedLast.rawValue и передать его прямо в функцию в качестве аргумента bitmapInfo.Преобразование необходимо только в том случае, если вы также комбинируете информацию о порядке байтов с альфа-информацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...