我正在尝试创建一个CGContext,在其中我可以绘制一个图像来检索原始像素数据,以便以后进行处理。我正在使用依赖于我正在处理的图像的颜色空间来创建CGContext。当我使用灰度或CMYK色彩空间时,这可以很好地工作,但当我使用任何RGB色彩空间时,我无法获得有效的CGContext。下面的代码片段说明了我所看到的行为(使用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??发布于 2019-03-04 06:49:05
您应该会在控制台中看到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参数直接传递给函数即可。只有在将字节排序信息与alpha信息组合在一起时,才需要转换。
https://stackoverflow.com/questions/54974385
复制相似问题