首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用任何RGB颜色空间时,无法获得有效的CGContext?

当使用任何RGB颜色空间时,无法获得有效的CGContext?
EN

Stack Overflow用户
提问于 2019-03-04 06:25:04
回答 1查看 660关注 0票数 0

我正在尝试创建一个CGContext,在其中我可以绘制一个图像来检索原始像素数据,以便以后进行处理。我正在使用依赖于我正在处理的图像的颜色空间来创建CGContext。当我使用灰度或CMYK色彩空间时,这可以很好地工作,但当我使用任何RGB色彩空间时,我无法获得有效的CGContext。下面的代码片段说明了我所看到的行为(使用Swift 4,XCode 10.1)。我肯定遗漏了一些明显的东西,但无论如何我都找不到。任何帮助都将不胜感激!

代码语言:javascript
复制
//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??
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-04 06:49:05

您应该会在控制台中看到CGBitmapContextCreate: unsupported parameter combination。只要改变就好

代码语言:javascript
复制
let bmpinfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue)

代码语言:javascript
复制
let bmpinfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)

你应该可以走了。示例:

代码语言:javascript
复制
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)

打印:

代码语言:javascript
复制
<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参数直接传递给函数即可。只有在将字节排序信息与alpha信息组合在一起时,才需要转换。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54974385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档