26

我有一个具有不受支持的位图图形上下文像素格式的 PNG 图像。每当我尝试调整图像大小时,都会CGBitmapContextCreate()因不支持的格式而窒息

我收到以下错误(错误格式为便于阅读):

CGBitmapContextCreate: unsupported parameter combination: 
    8 integer bits/component; 
    32 bits/pixel; 
    3-component colorspace; 
    kCGImageAlphaLast; 
    1344 bytes/row.

支持的像素格式列表肯定不支持这种组合。看来我需要重绘图像并将 alpha 通道信息移动到kCGImageAlphaPremultipliedFirst 或 kCGImageAlphaPremultipliedLast

我不知道该怎么做。

PNG文件没有什么异常,也没有损坏。它在所有其他情况下都可以正常工作。我偶然遇到了这个错误,但显然我的用户可能有类似格式的文件,所以我必须检查我的应用程序导入的图像并纠正这个问题。

4

2 回答 2

59

是的,我遇到了 8 位(索引).PNG 的问题。我必须将其转换为更原生的图像才能执行图形操作。我基本上做了这样的事情:

- (UIImage *) normalize {

    CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL, 
                                                         self.size.width, 
                                                         self.size.height, 
                                                         8, (4 * self.size.width), 
                                                         genericColorSpace, 
                                                         kCGImageAlphaPremultipliedFirst);
    CGColorSpaceRelease(genericColorSpace);
    CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault);
    CGRect destRect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage);
    CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt);
    CGContextRelease(thumbBitmapCtxt);    
    UIImage *result = [UIImage imageWithCGImage:tmpThumbImage];
    CGImageRelease(tmpThumbImage);

    return result;    
}
于 2010-03-20T21:48:06.130 回答
5

这是来自 Alfons 的方法的更新版本,用于考虑屏幕比例,以及原始答案中未同步的评论中描述的图像大小浮点值中的小数点的一些愚蠢错误。

SCREEN_SCALE 是一个宏,如果未定义比例,则返回 1.0,或者无论设备比例实际是什么 ([UIScreen mainScreen].scale)。

- (UIImage *) normalize {

    CGSize size = CGSizeMake(round(self.size.width*SCREEN_SCALE), round(self.size.height*SCREEN_SCALE));
    CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL, 
                                                         size.width, 
                                                         size.height, 
                                                         8, (4 * size.width), 
                                                         genericColorSpace, 
                                                         kCGImageAlphaPremultipliedFirst);
    CGColorSpaceRelease(genericColorSpace);
    CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault);
    CGRect destRect = CGRectMake(0, 0, size.width, size.height);
    CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage);
    CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt);
    CGContextRelease(thumbBitmapCtxt);    
    UIImage *result = [UIImage imageWithCGImage:tmpThumbImage scale:SCREEN_SCALE orientation:UIImageOrientationUp];
    CGImageRelease(tmpThumbImage);

    return result;    
}
于 2012-02-20T22:47:55.407 回答