| /* |
| * This file is part of the SDWebImage package. |
| * (c) Olivier Poitrey <rs@dailymotion.com> |
| * |
| * Created by james <https://github.com/mystcolor> on 9/28/11. |
| * |
| * For the full copyright and license information, please view the LICENSE |
| * file that was distributed with this source code. |
| */ |
| |
| #import "SDWebImageDecoder.h" |
| |
| @implementation UIImage (ForceDecode) |
| |
| + (UIImage *)decodedImageWithImage:(UIImage *)image { |
| // while downloading huge amount of images |
| // autorelease the bitmap context |
| // and all vars to help system to free memory |
| // when there are memory warning. |
| // on iOS7, do not forget to call |
| // [[SDImageCache sharedImageCache] clearMemory]; |
| @autoreleasepool{ |
| // do not decode animated images |
| if (image.images) { return image; } |
| |
| CGImageRef imageRef = image.CGImage; |
| |
| CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef); |
| BOOL anyAlpha = (alpha == kCGImageAlphaFirst || |
| alpha == kCGImageAlphaLast || |
| alpha == kCGImageAlphaPremultipliedFirst || |
| alpha == kCGImageAlphaPremultipliedLast); |
| |
| if (anyAlpha) { return image; } |
| |
| size_t width = CGImageGetWidth(imageRef); |
| size_t height = CGImageGetHeight(imageRef); |
| |
| // current |
| CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); |
| CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); |
| |
| bool unsupportedColorSpace = (imageColorSpaceModel == 0 || imageColorSpaceModel == -1 || imageColorSpaceModel == kCGColorSpaceModelCMYK || imageColorSpaceModel == kCGColorSpaceModelIndexed); |
| if (unsupportedColorSpace) |
| colorspaceRef = CGColorSpaceCreateDeviceRGB(); |
| |
| CGContextRef context = CGBitmapContextCreate(NULL, width, |
| height, |
| CGImageGetBitsPerComponent(imageRef), |
| 0, |
| colorspaceRef, |
| kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); |
| |
| // Draw the image into the context and retrieve the new image, which will now have an alpha layer |
| CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); |
| CGImageRef imageRefWithAlpha = CGBitmapContextCreateImage(context); |
| UIImage *imageWithAlpha = [UIImage imageWithCGImage:imageRefWithAlpha scale:image.scale orientation:image.imageOrientation]; |
| |
| if (unsupportedColorSpace) |
| CGColorSpaceRelease(colorspaceRef); |
| |
| CGContextRelease(context); |
| CGImageRelease(imageRefWithAlpha); |
| |
| return imageWithAlpha; |
| } |
| } |
| |
| @end |