CGBitmapContextCreate:不支持的参数组合

问题描述 投票:0回答:6

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

CGBitmapContextCreate:不支持的参数组合:8 个整数位/组件; 24 位/像素;三分量色彩空间; 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。

那么,不一致的地方到底在哪里呢?这让我发疯。

macos core-graphics
6个回答
21
投票

出于我不明白的原因,我通过将 BitmapInfo 参数设置为

kCGImageAlphaNoneSkipLast
解决了这个问题。


7
投票

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

Quartz 2D 编程文档中列出了支持的像素格式。不支持 8/3/24 组合,但支持 8/3/32,与是否使用 alpha 无关。


3
投票

Heinrich 为您提供了答案的良好背景。只是想我会提供我的具体案例,作为塔尔梅斯答案的替代方案。该答案的问题在于,如果您想要存在 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....)


1
投票

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

我的问题是:

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

有错误:

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

然后我发现一个错误是header_fontsize没有赋值任何值(因为我把fontsize误认为是header_fontsize)。错误就在这里:

dimensions:CGSizeMake(header_fontsize*9, txt_h)
与header_fontsize未分配任何值(不是0,分配
header_fontsize = 0
仍然可以);为
header_fontsize
重新分配一个值解决了该问题。

希望这对遇到类似情况的人有所帮助,例如雪碧的情况。


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了解更多信息(以及支持的像素格式列表)


0
投票

Swift 版本

@tarmes 的答案效果很好,但在现代,你需要将

kCGImageAlphaNoneSkipLast
翻译成 Swift。这样做的胡言乱语是:

CGImageAlphaInfo.noneSkipLast.rawValue

将其传递给

bitmapInfo
参数。

© www.soinside.com 2019 - 2024. All rights reserved.