diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 80019ff3..2bb5472f 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -19,14 +19,16 @@ // when there are memory warning. // on iOS7, do not forget to call // [[SDImageCache sharedImageCache] clearMemory]; - + if (image == nil) { // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error return nil; } - + @autoreleasepool{ // do not decode animated images - if (image.images) { return image; } + if (image.images != nil) { + return image; + } CGImageRef imageRef = image.CGImage; @@ -35,43 +37,55 @@ alpha == kCGImageAlphaLast || alpha == kCGImageAlphaPremultipliedFirst || alpha == kCGImageAlphaPremultipliedLast); - - if (anyAlpha) { return image; } + if (anyAlpha) { + return image; + } // current CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); - bool unsupportedColorSpace = (imageColorSpaceModel == 0 || imageColorSpaceModel == -1 || imageColorSpaceModel == kCGColorSpaceModelCMYK || imageColorSpaceModel == kCGColorSpaceModelIndexed); - if (unsupportedColorSpace) + BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || + imageColorSpaceModel == kCGColorSpaceModelMonochrome || + imageColorSpaceModel == kCGColorSpaceModelCMYK || + imageColorSpaceModel == kCGColorSpaceModelIndexed); + if (unsupportedColorSpace) { colorspaceRef = CGColorSpaceCreateDeviceRGB(); + } size_t width = CGImageGetWidth(imageRef); size_t height = CGImageGetHeight(imageRef); NSUInteger bytesPerPixel = 4; NSUInteger bytesPerRow = bytesPerPixel * width; NSUInteger bitsPerComponent = 8; - + + + // kCGImageAlphaNone is not supported in CGBitmapContextCreate. + // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast + // to create bitmap graphics contexts without alpha info. CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorspaceRef, - kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); + kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); - // Draw the image into the context and retrieve the new image, which will now have an alpha layer + // Draw the image into the context and retrieve the new bitmap image without alpha CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); - CGImageRef imageRefWithAlpha = CGBitmapContextCreateImage(context); - UIImage *imageWithAlpha = [UIImage imageWithCGImage:imageRefWithAlpha scale:image.scale orientation:image.imageOrientation]; + CGImageRef imageRefWithoutAlpha = CGBitmapContextCreateImage(context); + UIImage *imageWithoutAlpha = [UIImage imageWithCGImage:imageRefWithoutAlpha + scale:image.scale + orientation:image.imageOrientation]; - if (unsupportedColorSpace) + if (unsupportedColorSpace) { CGColorSpaceRelease(colorspaceRef); + } CGContextRelease(context); - CGImageRelease(imageRefWithAlpha); + CGImageRelease(imageRefWithoutAlpha); - return imageWithAlpha; + return imageWithoutAlpha; } }