创建位图上下文时出现此错误:
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。
那么,不一致的地方到底在哪里呢?这让我发疯。
出于我不明白的原因,我通过将 BitmapInfo 参数设置为
kCGImageAlphaNoneSkipLast
解决了这个问题。
CGBitmapContextCreate:不支持的参数组合:8 个整数位/组件; 24 位/像素;三分量色彩空间; kCGImageAlphaNone; 7936 字节/行。
Quartz 2D 编程文档中列出了支持的像素格式。不支持 8/3/24 组合,但支持 8/3/32,与是否使用 alpha 无关。
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....)
我不确定这是否会对任何人有帮助,我只是遇到了类似的问题,并按照建议尝试,但没有运气。
我的问题是:
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
重新分配一个值解决了该问题。
希望这对遇到类似情况的人有所帮助,例如雪碧的情况。
某些像素格式不受支持。
您可以提前检查是否支持任何图像:
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了解更多信息(以及支持的像素格式列表)
@tarmes 的答案效果很好,但在现代,你需要将
kCGImageAlphaNoneSkipLast
翻译成 Swift。这样做的胡言乱语是:
CGImageAlphaInfo.noneSkipLast.rawValue
将其传递给
bitmapInfo
参数。