【问题标题】:CGBitmapContextCreate stopped working for iOS 9CGBitmapContextCreate 停止为 iOS 9 工作
【发布时间】:2016-05-22 23:20:05
【问题描述】:

所以这段代码曾经在 iOS 8 上工作,但在 iOS 9 上停止工作

let bitsPerComponent = CGImageGetBitsPerComponent(cgImage)
let colorSpace = CGImageGetColorSpace(cgImage)
let bitmapInfo = CGImageGetBitmapInfo(cgImage)
let context =
    CGBitmapContextCreate(
        nil, newPixelWidth, newPixelHeight, bitsPerComponent, 0, colorSpace,
        bitmapInfo.rawValue)

CoreGraphics 的解释是:

CGBitmapContextCreate: unsupported parameter combination:
    8 integer bits/component;
    32 bits/pixel;
    RGB color space model; kCGImageAlphaLast;
    2400 bytes/row.
Valid parameters for RGB color space model are:
    16  bits per pixel,      5  bits per component,      kCGImageAlphaNoneSkipFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipLast
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaPremultipliedLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaNoneSkipLast
    128 bits per pixel,      32 bits per component,      kCGImageAlphaNoneSkipLast |kCGBitmapFloatComponents
    128 bits per pixel,      32 bits per component,      kCGImageAlphaPremultipliedLast |kCGBitmapFloatComponents

但是newPixelWidth 是 600 和 600*4 = 2400。这里有什么关系?

【问题讨论】:

    标签: ios swift swift2 core-graphics


    【解决方案1】:

    我不是专家,但你没有给出自己的答案吗?

    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipLast
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedLast
    

    这些都不是kCGImageAlphaLast,所以我认为这是问题所在。

    【讨论】:

    • 我看不出不预乘 alpha 会如何以任何方式影响上下文的大小,但这仍然是一个好点。麻烦的是,OP 正在传递 Core Graphics 为图像生成的位图信息自身(以及其他参数)。虽然肯定是一个奇怪的崩溃,但我无法发现 OP 的代码有任何其他问题。
    • @originaluser2 查看一些“相关”问题和答案。更改位图信息值确实很重要。 — 另外,CGImageBitmapInfo 中的内容不仅仅是 alpha,因此可能 OP 以某种方式滥用了这个值。正如我所说,我不是这方面的专家,所以我只是猜测。
    • @matt 你是对的。将 CGImageAlphaInfo.PremultipliedLast.rawValue 作为最后一个参数传递给 CGBitmapContextCreate 确实有效。所以我认为没有连贯的方法来使用最新的 iOS/SDK 调整有效的任意 CG 图像的大小(或者可能多年来一直如此)。谢谢您的帮助。还有你最棒的书。
    • @matt 经过进一步研究(参见herehere),似乎Quartz 支持图像的预乘alpha 格式。所以我猜 OP 的代码可以正常工作,但他只需要为他的输入图像使用支持的格式。
    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多