123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /*
- * 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
|