代码之家  ›  专栏  ›  技术社区  ›  TechZen

iphone:更改cgimage的cgimagealphanfo

  •  25
  • TechZen  · 技术社区  · 14 年前

    我有一个PNG图像有一个不支持的位图图形上下文像素格式。每当我试图调整图像的大小时, CGBitmapContextCreate() 阻塞不支持的格式

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

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

    这个 list of supported pixel formats 绝对不支持这种组合。似乎我需要重新绘制图像并将alpha通道信息移动到 kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast .

    我不知道该怎么做。

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

    2 回复  |  直到 12 年前
        1
  •  56
  •   Alfons    14 年前

    是的,我有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;    
    }
    
        2
  •  5
  •   psy    12 年前

    这是alfons-answer方法的更新版本,用于解释屏幕比例,还有一些愚蠢的错误,如unsynchronized在原始答案的注释中描述的图像大小的浮点值的小数。

    screen_scale是一个宏,如果没有定义scale或设备实际的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;    
    }