iPhone CGContextRef CGBitmapContextCreate不支持的参数组合

时间:2011-04-04 23:44:54

标签: iphone uiimage cgcontext cgimage cgbitmapcontextcreate

在我的应用程序中,我需要调整大小并裁剪一些本地和在线存储的图像。我正在使用Trevor Harmon's tutorial来实现UIImage+Resize

在我的iPhone 4(iOS 4.3.1)上一切正常,我没有问题。但是在我的iPhone 3G(iOS 3.2)上,调整大小和裁剪方法对任何图片都不起作用(本地存储的是PNG)。 这是控制台输出:

Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate:     unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.

这是裁剪方法

- (UIImage *)croppedImage:(CGRect)bounds 
{
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return croppedImage;
}

resize方法是:

- (UIImage *)resizedImage:(CGSize)newSize
            transform:(CGAffineTransform)transform
       drawTransposed:(BOOL)transpose
 interpolationQuality:(CGInterpolationQuality)quality 
{
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
    CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width);
    CGImageRef imageRef = self.CGImage;

    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            CGImageGetBitsPerComponent(imageRef),
                                            0,
                                            CGImageGetColorSpace(imageRef),
                                            CGImageGetBitmapInfo(imageRef));
    if(bitmap == nil)
        return nil;

    CGContextConcatCTM(bitmap, transform);

    CGContextSetInterpolationQuality(bitmap, quality);

    CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef);

    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    CGContextRelease(bitmap);
    CGImageRelease(newImageRef);

    return newImage;
}

有人可以向我解释我有这个问题吗?

谢谢你, 安德烈

5 个答案:

答案 0 :(得分:23)

回复此处,因为当我收到此错误时,我的格式完全相同。我希望这个答案有助于某人。

在我的情况下失败的原因是,{8}在iOS 8上不再允许kCGImageAlphaLast,但它在iOS 7上运行良好.32 pbb,8 bpc组合仅允许{ Alpha信息的{1}}和kCGImageAlphaNoneSkip*。显然这总是一个问题,但在iOS 8之前没有强制执行。这是我的解决方案:

kCGImageAlphaPremultiplied*

在我的情况下,失败的代码看起来像这样,其中imageRef是从应用程序包加载的PNG的CGImageRef:

- (CGBitmapInfo)normalizeBitmapInfo:(CGBitmapInfo)oldBitmapInfo {
    //extract the alpha info by resetting everything else
    CGImageAlphaInfo alphaInfo = oldBitmapInfo & kCGBitmapAlphaInfoMask;

    //Since iOS8 it's not allowed anymore to create contexts with unmultiplied Alpha info
    if (alphaInfo == kCGImageAlphaLast) {
        alphaInfo = kCGImageAlphaPremultipliedLast;
    }
    if (alphaInfo == kCGImageAlphaFirst) {
        alphaInfo = kCGImageAlphaPremultipliedFirst;
    }

    //reset the bits
    CGBitmapInfo newBitmapInfo = oldBitmapInfo & ~kCGBitmapAlphaInfoMask;

    //set the bits to the new alphaInfo
    newBitmapInfo |= alphaInfo;

    return newBitmapInfo;
}

来源: https://stackoverflow.com/a/19345325/3099609

https://developer.apple.com/library/mac/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-BCIBHHBB

答案 1 :(得分:5)

我发现它是色彩空间的问题。只需用CGColorSpaceCreateDeviceRGB()替换CGImageGetColorSpace(imageRef)。当我尝试保存从AVCaptureSession获取的图像时,这对我有用。别忘了发布它!

CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            CGImageGetBitsPerComponent(imageRef),
                                            0,
                                            rgbColorSpace,//CGImageGetColorSpace(imageRef), sometimes contains unsupported colorspace
                                            bitmapInfo);
CGColorSpaceRelease(rgbColorSpace);

答案 2 :(得分:3)

好的,这可能会或可能不会帮助你(我感谢这是一个老帖子)

我遇到了类似的问题,因为width参数(在你的情况下是newRect.size.width)有一个小数部分(例如100.001而不是100.0)。我将它转换为整数并返回,截断小数组件,问题就消失了。我猜测有一个测试,看到每个组件的像素数x像素等加起来,它不能处理小数像素/点。如果它有帮助,欢迎使用这种方法。

+(CGSize)  fixSize:(CGSize) forSize{
    NSInteger w = (NSInteger) forSize.width;
    NSInteger h = (NSInteger) forSize.height;
    return CGSizeMake(w, h);
}

答案 3 :(得分:3)

我在iOS 5模拟器上遇到了同样的问题,上面的答案没有解决我的问题:图片没有加载,控制台仍报告相同的错误。

我使用的是非常受欢迎的类别here

this blog人们遇到同样的问题。马特从2011年11月22日开始的回答帮助了我。

干杯!

答案 4 :(得分:0)

当我从5.1切换到6.1进行测试时,我在模拟器中看到了这个问题。关闭模拟器并再次打开它似乎已经删除了错误。