CGBitmapContextCreate:不支持的参数组合

时间:2012-11-23 10:58:30

标签: macos core-graphics

创建位图上下文时出现此错误:

CGBitmapContextCreate:不支持的参数组合:8个整数位/组件; 24位/像素; 3组分色彩空间; kCGImageAlphaNone; 7936字节/行。

这是代码(请注意,上下文基于现有CGImage的参数:

context = CGBitmapContextCreate(NULL,
                                (int)pi.bufferSizeRequired.width,
                                (int)pi.bufferSizeRequired.height,
                                CGImageGetBitsPerComponent(imageRef),
                                0,
                                CGImageGetColorSpace(imageRef),
                                CGImageGetBitmapInfo(imageRef));

宽度为2626,高度为3981.我将bytesPerRow保留为零,以便自动为我计算,并且自行选择7936。

那么,地球上的不一致之处是什么?这让我疯了。

5 个答案:

答案 0 :(得分:18)

由于我不明白的原因,我通过将BitmapInfo参数设置为kCGImageAlphaNoneSkipLast来解决此问题。

答案 1 :(得分:6)

  

CGBitmapContextCreate:不支持的参数组合:8个整数位/组件; 24位/像素; 3组分色彩空间; kCGImageAlphaNone; 7936字节/行。

在Quartz 2D Programming文档中列出了supported pixel formats。不支持8/3/24组合,但8/3/32是独立于否使用alpha。

答案 2 :(得分:2)

海因里希给你一个很好的答案背景。只是想我会提出我的具体案例,作为tarmes答案的替代方案。该答案的问题在于,如果您想要存在Alpha通道,则无法解决问题。当我遇到这个问题时,我正在使用一个名为UIImage+Alpha by Trevor Harmon的类别。在代码中我发现了这条评论:

// The bitsPerComponent and bitmapInfo values are hard-coded to prevent an "unsupported parameter combination" error

现在,这个硬编码修复程序是在调用CGBitmapContextCreate的方法之一,而不是跟随它的方法之一。所以对我而言,这只是遵循作者自己的建议来解决他的其他方法中的问题;)

显然,CGBitmapInfo的某些部分未能从相关图片中正确传递,但为什么我不知道。

如果你正在使用alpha通道,请在bitmapInfo中使用这些常量:kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst

否则,如果您正在处理别名问题,我只想指出它是一个非常有用的类!

(另外,值得一提的是这个问题只出现在Xcode 6中....)

答案 3 :(得分:1)

我不确定它会对任何人有所帮助,我只是碰到了类似的问题并按照建议尝试但没有运气。

我的问题是:

CCLabelTTF *header_txt = [CCLabelTTF 
   labelWithString:header 
   fontName:fontname fontSize:header_fontsize 
   dimensions:CGSizeMake(header_fontsize*9, txt_h) 
   hAlignment:kCCTextAlignmentLeft 
   vAlignment:kCCVerticalTextAlignmentCenter];

错误:

  

<错误>:CGBitmapContextCreate:不支持的参数组合:8个整数位/组件; 8位/像素;单组分色彩空间; kCGImageAlphaNone; 2147483648字节/行。

然后我发现一个错误是header_fontsize没有分配任何值(因为我错误地将headerize与header_fontsize错误)。错误在于:dimensions:CGSizeMake(header_fontsize*9, txt_h)使用header_fontsize取消分配任何值(它不是0,分配header_fontsize = 0仍然可以);将值重新分配给header_fontsize解决了问题。

希望这会帮助类似案例的人,例如Sprite案例。

答案 4 :(得分:0)

某些像素格式不受支持。

您可以提前检查是否支持任何图像:

extension CGImage {
  public var hasCGContextSupportedPixelFormat: Bool {
    guard let colorSpace = self.colorSpace else {
      return false
    }
    #if os(iOS) || os(watchOS) || os(tvOS)
    let iOS = true
    #else
    let iOS = false
    #endif

    #if os(OSX)
    let macOS = true
    #else
    let macOS = false
    #endif
    switch (colorSpace.model, bitsPerPixel, bitsPerComponent, alphaInfo, bitmapInfo.contains(.floatComponents)) {
    case (.unknown, 8, 8, .alphaOnly, _):
      return macOS || iOS
    case (.monochrome, 8, 8, .none, _):
      return macOS || iOS
    case (.monochrome, 8, 8, .alphaOnly, _):
      return macOS || iOS
    case (.monochrome, 16, 16, .none, _):
      return macOS
    case (.monochrome, 32, 32, .none, true):
      return macOS
    case (.rgb, 16, 5, .noneSkipFirst, _):
      return macOS || iOS
    case (.rgb, 32, 8, .noneSkipFirst, _):
      return macOS || iOS
    case (.rgb, 32, 8, .noneSkipLast, _):
      return macOS || iOS
    case (.rgb, 32, 8, .premultipliedFirst, _):
      return macOS || iOS
    case (.rgb, 32, 8, .premultipliedLast, _):
      return macOS || iOS
    case (.rgb, 64, 16, .premultipliedLast, _):
      return macOS
    case (.rgb, 64, 16, .noneSkipLast, _):
      return macOS
    case (.rgb, 128, 32, .noneSkipLast, true):
      return macOS
    case (.rgb, 128, 32, .premultipliedLast, true):
      return macOS
    case (.cmyk, 32, 8, .none, _):
      return macOS
    case (.cmyk, 64, 16, .none, _):
      return macOS
    case (.cmyk, 128, 32, .none, true):
      return macOS
    default:
      return false
    }
  }
}

有关详细信息(以及支持的像素格式列表),请参阅 https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html