| /* | |
| * 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 { | |
| if (image.images) { | |
| // Do not decode animated images | |
| return image; | |
| } | |
| CGImageRef imageRef = image.CGImage; | |
| CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); | |
| CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize}; | |
| CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); | |
| CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); | |
| int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask); | |
| BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone || | |
| infoMask == kCGImageAlphaNoneSkipFirst || | |
| infoMask == kCGImageAlphaNoneSkipLast); | |
| // CGBitmapContextCreate doesn't support kCGImageAlphaNone with RGB. | |
| // https://developer.apple.com/library/mac/#qa/qa1037/_index.html | |
| if (infoMask == kCGImageAlphaNone && CGColorSpaceGetNumberOfComponents(colorSpace) > 1) { | |
| // Unset the old alpha info. | |
| bitmapInfo &= ~kCGBitmapAlphaInfoMask; | |
| // Set noneSkipFirst. | |
| bitmapInfo |= kCGImageAlphaNoneSkipFirst; | |
| } | |
| // Some PNGs tell us they have alpha but only 3 components. Odd. | |
| else if (!anyNonAlpha && CGColorSpaceGetNumberOfComponents(colorSpace) == 3) { | |
| // Unset the old alpha info. | |
| bitmapInfo &= ~kCGBitmapAlphaInfoMask; | |
| bitmapInfo |= kCGImageAlphaPremultipliedFirst; | |
| } | |
| // It calculates the bytes-per-row based on the bitsPerComponent and width arguments. | |
| CGContextRef context = CGBitmapContextCreate(NULL, | |
| imageSize.width, | |
| imageSize.height, | |
| CGImageGetBitsPerComponent(imageRef), | |
| 0, | |
| colorSpace, | |
| bitmapInfo); | |
| CGColorSpaceRelease(colorSpace); | |
| // If failed, return undecompressed image | |
| if (!context) return image; | |
| CGContextDrawImage(context, imageRect, imageRef); | |
| CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context); | |
| CGContextRelease(context); | |
| UIImage *decompressedImage = [UIImage imageWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation]; | |
| CGImageRelease(decompressedImageRef); | |
| return decompressedImage; | |
| } | |
| @end |