ios - 这个方法的原理是什么?
阿神
阿神 2017-04-17 17:52:18
[iOS讨论组]

读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)
PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号