读sdwebimage源码看到这个方法,完全不懂
这个方法涉及到的技术在哪可以深入研究?
+ (UIImage *)+ (UIImage *)decodedImageWithImage:(UIImage *)image{ if (img.images) { return img; } CGImageRef imageRef = img.CGImage; CGSize imgSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); CGRect imgRect = (CGRect){.origin = CGPointZero, .size = imgSize}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask); BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone || infoMask == kCGImageAlphaNoneSkipFirst || infoMask == kCGImageAlphaNoneSkipLast); // CGBitmapContextCreate 不支持 kCGImageAlphaNone with rgb // https://developer.apple.com/library/mac/#qa/qa1037/_index.html if (infoMask == kCGImageAlphaNone && CGColorSpaceGetNumberOfComponents(colorSpace) > 1) { bitmapInfo &= ~kCGBitmapAlphaInfoMask; bitmapInfo |= kCGImageAlphaNoneSkipFirst; } // Some PNGs tell us they have alpha but only 3 components. Odd. else if (!anyNonAlpha && CGColorSpaceGetNumberOfComponents(colorSpace) == 3){ bitmapInfo &= ~kCGBitmapAlphaInfoMask; bitmapInfo |= kCGImageAlphaPremultipliedFirst; } CGContextRef context = CGBitmapContextCreate(NULL ,imgSize.width ,imgSize.height ,CGImageGetBitsPerComponent(imageRef) ,0 ,colorSpace ,bitmapInfo); CGColorSpaceRelease(colorSpace); if (!context) { return img; } CGContextDrawImage(context, imgRect, imageRef); CGImageRef decompressedImgRef = CGBitmapContextCreateImage(context); CGContextRelease(context); UIImage *decompressedImg = [UIImage imageWithCGImage:decompressedImgRef scale:img.scale orientation:img.imageOrientation]; CGImageRelease(decompressedImgRef); return decompressedImg; }
简单来说。这个方法会强制在非主线程
解析图片,加快应用的响应速度。
如果有需要,我可以写一篇文章来详细解释一下,里面的代码逻辑。