ios - 这个方法的原理是什么?

 卢嘉怡i 发布于 2022-10-28 22:53

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

    2022-11-12 01:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有