iphonepngalphacgimagecgbitmapcontextcreate

iPhone: Changing CGImageAlphaInfo of CGImage


I have a PNG image that has an unsupported bitmap graphics context pixel format. Whenever I attempt to resize the image, CGBitmapContextCreate() chokes on the unsupported format

I receive the following error (error formatted for easy reading):

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

The list of supported pixel formats definitely does not support this combination. It appears I need to redraw the image and move the alpha channel information to kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast.

I have no idea how to go about doing this.

There is nothing unusual about the PNG file and it isn't corrupted. It works in all other context just fine. I encountered this error just by chance but obviously my users might have similarly formatted files so I will have to check my app's imported images and correct for this problem.


Solution

  • Yeah, I had problems with 8 bit (indexed) .PNGs. I had to convert it to a more native image to perform graphics operations. I essentially did something like this:

    - (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;    
    }