读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;
}
简单来说。这个方法会强制在非主线程
解析图片,加快应用的响应速度。
如果有需要,我可以写一篇文章来详细解释一下,里面的代码逻辑。