美文网首页
iOS中错误处理CYMK颜色空间的问题

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

作者: Yasic | 来源:发表于2018-10-22 19:49 被阅读145次

    今天在处理一张图片时图片处理后变成了纯黑色图片,其中定位到处理图片时进行了 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 信息。

    相关文章

      网友评论

          本文标题:iOS中错误处理CYMK颜色空间的问题

          本文链接:https://www.haomeiwen.com/subject/nccnzftx.html