<error>:CGBitmapContextCreate:不支持的参数组合与较低分辨率图像</error>

时间:2012-02-29 23:12:07

标签: iphone ios

- (UIImage *)roundedCornerImage:(NSInteger)cornerSize borderSize:(NSInteger)borderSize {
    // If the image does not have an alpha layer, add one
    UIImage *image = [self imageWithAlpha];

    // Build a context that's the same dimensions as the new size
    CGBitmapInfo info = CGImageGetBitmapInfo(image.CGImage);
    CGContextRef context = CGBitmapContextCreate(NULL,
                                             image.size.width,
                                             image.size.height,
                                             CGImageGetBitsPerComponent(image.CGImage),
                                             0,
                                             CGImageGetColorSpace(image.CGImage),
                                             CGImageGetBitmapInfo(image.CGImage));

    // Create a clipping path with rounded corners
    CGContextBeginPath(context);
    [self addRoundedRectToPath:CGRectMake(borderSize, borderSize, image.size.width - borderSize * 2, image.size.height - borderSize * 2)
                   context:context
                 ovalWidth:cornerSize
                ovalHeight:cornerSize];
    CGContextClosePath(context);
    CGContextClip(context);

    // Draw the image to the context; the clipping path will make anything outside the rounded rect transparent
    CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);

    // Create a CGImage from the context
    CGImageRef clippedImage = CGBitmapContextCreateImage(context);
    CGContextRelease(context);

    // Create a UIImage from the CGImage
    UIImage *roundedImage = [UIImage imageWithCGImage:clippedImage];
    CGImageRelease(clippedImage);

    return roundedImage;
}

我有上面的方法,并在Twitter个人资料图片中添加圆角。对于大多数图像,这很棒。有一些导致发生以下错误:

  

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

我做了一些调试,在创建上下文时,它看起来与导致错误的图像和不存在错误的图像的唯一区别是参数CGImageGetBitmapInfo(image.CGImage)。这会抛出错误并导致上下文为null。我尝试将最后一个参数设置为kCGImageAlphaPremultipliedLast也无济于事。这次拍摄的图像质量较差。有没有办法让更高质量的图像与其他图像相提并论?图像的路径是通过Twitter,所以不确定它们是否有不同的可以拉动。

我也看到了有关此错误的其他问题。没有人解决过这个问题。我看到this post,但错误的图像在此之后完全模糊。并且向NSInteger投射宽度和高度也没有用。以下是两张个人资料图片及其质量的屏幕截图。第一个是导致错误。

Here is a screenshot of the two images and their quality

有谁知道这里的问题是什么?

非常感谢。这已经杀了我。

1 个答案:

答案 0 :(得分:4)

iOS不支持kCGImageAlphaLast。您需要使用kCGImageAlphaPremultipliedLast

您还需要处理初始图像的比例。您当前的代码没有,因此如果图像的比例为2.0,则会对图像进行下采样。<​​/ p>

您可以使用UIKit函数和类更简单地编写整个函数。 UIKit将为您量身定制;当你要求它创建图形上下文时,你只需要传入原始图像的比例。

- (UIImage *)roundedCornerImage:(NSInteger)cornerSize borderSize:(NSInteger)borderSize {
    // If the image does not have an alpha layer, add one
    UIImage *image = [self imageWithAlpha];

    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); {
        CGRect imageRect = (CGRect){ CGPointZero, image.size };
        CGRect borderRect = CGRectInset(imageRect, borderSize, borderSize);
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:borderRect
            byRoundingCorners:UIRectCornerAllCorners
            cornerRadii:CGSizeMake(cornerSize, cornerSize)];
        [path addClip];
        [image drawAtPoint:CGPointZero];
    }
    UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return roundedImage;
}

如果您的imageWithAlpha方法本身从另一个UIImage创建UIImage,则还需要传播该比例。