iOS中错误处理CYMK颜色空间的问题

今天在处理一张图片时图片处理后变成了纯黑色图片,其中定位到处理图片时进行了 CGContext 绘制操作,初始化 context 的代码如下所示:

CGContextRef contextRef = CGBitmapContextCreate(NULL, width, height, 8, 0, CGImageGetColorSpace(image.CGImage), kCGImageAlphaNoneSkipLast|kCGBitmapByteOrderDefault);

报错信息如下

[Unknown process name] CGBitmapContextCreate: unsupported parameter combination: set CGBITMAP_CONTEXT_LOG_ERRORS environmental variable to see the details
[Unknown process name] CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
[Unknown process name] CGBitmapContextCreateImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

最终发现图片的颜色空间是 CYMK 格式的

po CGImageGetColorSpace(image.CGImage)
<CGColorSpace 0x282631ce0> (kCGColorSpaceICCBased; kCGColorSpaceModelCMYK; Japan Color 2001 Coated)

按照 Quartz 2D Programming Guide 的 Graphics Contexts 中介绍的有关位图上下文支持的像素格式,iOS 设备仅支持 RGB 和 GRAY,不支持 CYMK 格式,所以导致无法创建位图上下文,从而不能进行画布绘制等操作。

CS Pixel format and bitmap information constant Availability
Null 8 bpp, 8 bpc, kCGImageAlphaOnly Mac OS X, iOS
Gray 8 bpp, 8 bpc,kCGImageAlphaNone Mac OS X, iOS
Gray 8 bpp, 8 bpc,kCGImageAlphaOnly Mac OS X, iOS
Gray 16 bpp, 16 bpc, kCGImageAlphaNone Mac OS X
Gray 32 bpp, 32 bpc, kCGImageAlphaNone、kCGBitmapFloatComponents Mac OS X
RGB 16 bpp, 5 bpc, kCGImageAlphaNoneSkipFirst Mac OS X, iOS
RGB 32 bpp, 8 bpc, kCGImageAlphaNoneSkipFirst Mac OS X, iOS
RGB 32 bpp, 8 bpc, kCGImageAlphaNoneSkipLast Mac OS X, iOS
RGB 32 bpp, 8 bpc, kCGImageAlphaPremultipliedFirst Mac OS X, iOS
RGB 32 bpp, 8 bpc, kCGImageAlphaPremultipliedLast Mac OS X, iOS
RGB 64 bpp, 16 bpc, kCGImageAlphaPremultipliedLast Mac OS X
RGB 64 bpp, 16 bpc, kCGImageAlphaNoneSkipLast Mac OS X
RGB 128 bpp, 32 bpc, kCGImageAlphaNoneSkipLast、kCGBitmapFloatComponents Mac OS X
RGB 128 bpp, 32 bpc, kCGImageAlphaPremultipliedLast、kCGBitmapFloatComponents Mac OS X
CMYK 32 bpp, 8 bpc, kCGImageAlphaNone Mac OS X
CMYK 64 bpp, 16 bpc, kCGImageAlphaNone Mac OS X
CMYK 128 bpp, 32 bpc, kCGImageAlphaNone、kCGBitmapFloatComponents Mac OS X

更深入的说,Quartz 2D 支持颜色管理系统使用的标准颜色空间,也支持通用的颜色空间、索引颜色空间和模式(pattern)颜色空间,但 iOS 仅支持使用设备颜色空间,设备颜色空间创建方式如下

  • CGColorSpaceCreateDeviceGray:创建设备依赖灰度颜色空间
  • CGColorSpaceCreateDeviceRGB:创建设备依赖RGB颜色空间
  • CGColorSpaceCreateDeviceCMYK:创建设备依赖CMYK颜色空间

而 CoreGraphic 支持两种图形上下文,bitmapContext 和 PDFContext,通常使用的 bitmapContext 仅支持 RGB 和 Gray。

因此当创建 bitmap 时,不应当调用 CGImageGetColorSpace 从图片获取 colorSpace 来设置上下文。

此外,如果是通过 PhotoFramework 从相册直接获取到 UIImage 对象则 PhotoFramework 会帮你将其 colorSpace 转换为 RGB,但是获取 NSData 到内存中自己通过 imageWithData 方法转换则会保留它的 colorSpace 信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容