美文网首页
SDWebImage- 图像解码

SDWebImage- 图像解码

作者: linbj | 来源:发表于2018-02-02 15:15 被阅读113次

这篇文章中提到了
使用 UIImage 的时候,创建的图片通常不会直接加载到内存,而是在渲染的时候再进行解压并加载到内存。这就会导致 UIImage 在渲染的时候效率上不是那么高效。
为了提高效率通过 decodedImageWithImage 方法把图片提前解压加载到内存,这样这张新图片就不再需要重复解压了,提高了渲染效率。这是一种空间换时间的做法。

在渲染的时候,把图层按像素叠加, 并且会对每一个像素进行 RGBA 的叠加计算。当某个 layer 的是不透明的,GPU 可以直接忽略掉其下方的图层,这就减少了很多工作量。这也是调用 CGBitmapContextCreate 时 bitmapInfo 参数设置为忽略掉 alpha 通道的原因。

/**
 对传入的图片进行解码

 @param image 传入的image
 @return 解码后的image
 */
+ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image {
    if (![UIImage shouldDecodeImage:image]) {
        return image;
    }
    
    // autorelease the bitmap context and all vars to help system to free memory when there are memory warning.
    // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory];
  @autoreleasepool{
        
        CGImageRef imageRef = image.CGImage;
        CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:imageRef];
        
        size_t width = CGImageGetWidth(imageRef);
        size_t height = CGImageGetHeight(imageRef);
        
        // 一个像素4字节
        size_t bytesPerRow = kBytesPerPixel * width;

        // CGBitmapContextCreate不支持kCGImageAlphaNone
        // 当原图片没有alpha通道的时候使用kCGImageAlphaNoneSkipLast
        // 创建不包含alpha通道的bitmap上下文
        CGContextRef context = CGBitmapContextCreate(NULL,
                                                     width,
                                                     height,
                                                     kBitsPerComponent,
                                                     bytesPerRow,
                                                     colorspaceRef,
                                                     kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast);
        if (context == NULL) {
            return image;
        }
        
        // 将图片转换为上下文并且转换为不包含alpha通道的bitmap 图片
        CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
        CGImageRef imageRefWithoutAlpha = CGBitmapContextCreateImage(context);
        UIImage *imageWithoutAlpha = [UIImage imageWithCGImage:imageRefWithoutAlpha
                                                         scale:image.scale
                                                   orientation:image.imageOrientation];
        
        CGContextRelease(context);
        CGImageRelease(imageRefWithoutAlpha);
        
        return imageWithoutAlpha;
    }
}


/**
 判断是否需要解码

 @param image 传入的图片
 @return 判断是否需要解码
 */
+ (BOOL)shouldDecodeImage:(nullable UIImage *)image {
    // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error
    if (image == nil) {
        return NO;
    }

    // 不去解码images
    if (image.images != nil) {
        return NO;
    }
    
    CGImageRef imageRef = image.CGImage;
    
    // 获取alpha通道
    CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef);
    
    BOOL anyAlpha = (alpha == kCGImageAlphaFirst ||
                     alpha == kCGImageAlphaLast ||
                     alpha == kCGImageAlphaPremultipliedFirst ||
                     alpha == kCGImageAlphaPremultipliedLast);
    // do not decode images with alpha
    // 存在alpha 不去解码
    if (anyAlpha) {
        return NO;
    }
    
    return YES;
}

相关文章

  • SDWebImage- 图像解码

    在这篇文章中提到了使用 UIImage 的时候,创建的图片通常不会直接加载到内存,而是在渲染的时候再进行解压并加载...

  • 简单易用的图像解码库介绍 —— stb_image

    原文链接:简单易用的图像解码库介绍 —— stb_image 说到图像解码库,最容易想起的就是 libpng 和 ...

  • iOS 图像撕裂及解决方法

    1.图像撕裂 1.1 图像显示过程 图像 -> CPU将图片解码,交给GPU -> GPU进行图像的渲染 -> 存...

  • 图像渲染

    图像渲染的过程 图像 => GPU将图片解码 => GPU进行图像渲染 => 存储到帧缓存区 => 视频控制器...

  • 离屏渲染探索

    图像是怎么显示到屏幕上的 图像的显示是有CPU和GPU共同一起完成的,CPU: 负责图片的解码(视频解码是由GPU...

  • Fresco源码分析-图片解码

    图片编解码 在看Fresco对图片解码处理之前,先大致了解一下什么是图片与图片编解码。 图片编码与压缩 图像编码与...

  • YYImage

    YYImage特性 支持以下类型动画图像的播放/编码/解码:WebP, APNG, GIF。 支持以下类型静态图像...

  • ios硬编解码

    VideoToolbox中的对象: 1)CVPixelBuffer 编码前和解码后的图像数据结构(未压缩光栅图像缓...

  • swift 视频流 I. P.B 帧 PTS.DTS.CTS的

    I帧: 解码出是一副完整的图像 P帧: P 帧需要依赖视频流中排在它前面的帧才能解码出图像 B帧: B 帧则需要依...

  • 校园招聘2017

    网易招聘 图像算法工程师(北京) 岗位描述:1、负责实现并优化编解码及压缩等图像算法;2、负责图像相关的技术、系统...

网友评论

      本文标题:SDWebImage- 图像解码

      本文链接:https://www.haomeiwen.com/subject/nzfjzxtx.html