乐虎游戏|乐虎国际登录|欢迎你

YYImage 源码剖析:图片处理技巧

日期:2020-04-20编辑作者:计算机资讯

实际上图片的绘制过程往往不是性能瓶颈,最耗时的操作是解码过程,若图片文件过大,从磁盘读取的过程也有可观的耗时。

3、YYImage源码剖析与学习

静态图片

对于静态图片来说,WebP 比 PNG 体积小,可以省流量,但是解码时间长。如果不需要 WebP 的原图数据,可以把 WebP 静态图片保存为 PNG 或 JPEG,加快解码速度。这一步可以通过自定义下载操作 SDWebImageDownloaderOperation 实现。

SDWebImageDownloaderOperation 的 URLSession:task:didCompleteWithError: 方法会把下载好的原图数据 imageData 通过 callCompletionBlocksWithImage:imageData:error:finished: 方法传给上层的回调 SDWebImageDownloaderCompletedBlock。

图片 1

可以自定义 SDWebImageDownloaderOperation,修改 URLSession:task:didCompleteWithError: 方法,在上图箭头所指处修改 imageData,把静态 WebP 图片数据转为 PNG 或 JPEG 图片数据。修改上述方法只需要添加一行代码

imageData = [[SDWebImageCodersManager sharedInstance] encodedDataWithImage:image format:SDImageFormatUndefined];

原图数据有 Alpha 信息就转为 PNG,否则转为 JPEG。

自定义的类是 ImageDownloaderOperation,使用这个类需要一行代码

[[SDWebImageManager sharedManager].imageDownloader setOperationClass:[ImageDownloaderOperation class]];

首先问一个问题:你会用图片么?

3、信号量

信号量的讲解

/* 注意,正常的使用顺序是先降低然后再提高,这两个函数通常成对使用。 */ dispatch_semaphore_wait(_framesLock, DISPATCH_TIME_FOREVER); //等待降低信号量 // to do dispatch_semaphore_signal(_framesLock); //提高信号量

所用到的知识:复合赋值运算符、Image I/O、CADisplayLink、willChangeValueForKey:、

SDWebImage 加载显示 WebP 与性能问题

本文包含自定义下载操作 SDWebImageDownloaderOperation 与编码器 SDWebImageCoder。SDWebImage 的版本为 4.2.3。

加载优化

对于加载过程,若文件过大或加载频繁影响了帧率,可以使用异步方式加载图片,减少主线程的压力,代码大致如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"testImage" ofType:@"jpeg"]]; dispatch_async(dispatch_get_main_queue(), ^{ //业务 });});

一、YYImage总体介绍

图片 2YImage 结构1、YYImage 源码2、YYImage 源码的文字解析版本

  • 显示动画类型的图片
  • 播放帧动画
  • 播放 sprite sheet 动画
  • 图片类型探测
  • 图片解码、编码

动态图片

WebP 格式支持动态图片。SDWebImageWebPCoder 的 decodedImageWithData: 负责解码,返回 UIImage。如果是动态图片,每一帧图片都会解码,用所有图片帧和总动画时长通过 animatedImageWithImages:duration: 方法生成 UIImage。这样做的好处是,节省 CPU 资源,不用重复解码。对小图片来说,比较合适。如果图片太大,就会占内存多。另外,如果原图的每一帧动画时长不相等,那么实际播放的动画就与原图动画不符。可以用 YYImage 和 YYAnimatedImageView 来显示动态 WebP。这样可以用 CPU 资源换取内存空间(YYImage 也可以预先解码所有图片帧),也可以根据原图的每一帧动画时长来播放动画。直接使用 YYWebImage 框架是最方便的方法。然而,如果项目中需要统一图片的下载、缓存管理等操作,最好只用一套图片下载库。这里介绍用 SDWebImage 下载、缓存,用 YYImage 显示 WebP 的方法。

YYImage 会对 WebP 进行解码,因此不需要 SDWebImageWebPCoder 解码所有图片帧。自定义编码器 SDWebImageCoder,只对第一帧图片进行解码,减少解码时间。修改 decodedImageWithData: 方法,在解码每一帧图片的 while 循环中 (下图箭头所指处) 添加 break 即可,解码成功一帧图片就退出循环。

图片 3

自定义编码器的类是 FirstFrameWebPCoder,使用这个编码器

[SDWebImageCodersManager sharedInstance].coders = @[[SDWebImageImageIOCoder sharedCoder],
                                                    [FirstFrameWebPCoder sharedCoder]];

加载显示图片 (cell.imageView 是 YYAnimatedImageView)

cell.imageView.image = placeholder;
[[SDWebImageManager sharedManager] loadImageWithURL:url options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
    if ([image isKindOfClass:[YYImage class]]) {
        cell.imageView.image = image;
    } else if (data) {
        YYImage *yyimage = [YYImage imageWithData:data];
        cell.imageView.image = yyimage;
        NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url];
        [[SDWebImageManager sharedManager].imageCache storeImage:yyimage forKey:key toDisk:NO completion:nil];
    }
}];

代码已上传 GitHub:

转载请注明出处:

两种加载方式的区别

从上面的分析可知,imageNamed:使用时会产生全局的内存占用,但是第二次使用同一张图片时性能很好;imageWithData:不会有全局的内存占用,但对于同一张图片每次加载和解压都会“从头开始”。

由此可见,imageNamed:适合“小”且“使用频繁”的图片,imageWithData:适合“大”且“低频使用”的图片。

这里说的优化并不是解压算法的优化,只是基于用户体验的优化。

YYAnimatedImageView 类

用于显示动画图像的图像视图。可以用来播放多帧动画以及普通动画,可以控制、暂停动画当设备有足够的空闲内存时,这个视图及时请求帧数据。这个视图可以在内部缓冲区中缓存一些或所有未来的帧,以降低CPU成本。

图片是现代化 APP 界面设计里应用广泛的东西,精美的图片可以带来视觉上的享受,提高用户体验。由此给技术上带来了一些挑战,比如动图的处理、图片显示流畅程度的优化、图片包大小的优化、超大图片的处理等。

1、Image I/O

Image I/O 学习笔记Image I/O官方文档GIF图添加文字Demo

使用 CGBitmapContextCreate 函数创建一个位图上下文;使用 CGContextDrawImage 函数将原始位图绘制到上下文中;使用 CGBitmapContextCreateImage 函数创建一张新的解压缩后的位图。

本文主要是结合 YYImage 源码对图片处理技巧进行讲解。而笔者不会逐字逐句的翻译源码,主要是提取源码中有思维价值的东西。所以最好是打开源码,本文作为思想引导。

2、MJRefresh源码剖析与学习

本文由乐虎游戏发布于计算机资讯,转载请注明出处:YYImage 源码剖析:图片处理技巧

关键词:

4.3 多线程进阶篇<中>(GCD),4.3gcd

Hello, World!Endtask11!----NSThread: 0x1758fe10{number = 2,name = }task33!-----NSThread: 0x17673220{number = 3, name =}task44!-----NSThread: 0x1758fe10...

详细>>

CocoaPods 系列(三)—— 使用

后天给我们狼吞虎餐上面几点内容。 类型组件化、平台化是技能集团的一道目的,越来越多的技能公司体贴使用pod管...

详细>>

了解iOS消息推送一文就够:史上最全iOS Push技术详解

正文小编:陈裕发, 腾讯系统一测量试验试程序员,由TencentWeTest收拾揭橥。 网络介绍iOSPush的篇章有众多,不过超越...

详细>>

计算机在iOS开垦中应用Protobuf

Protobuf简介 protocolbuffer 是google的一种数据交换的格式,它独立于语言,独立于平台。google提供了多种语言的实现:j...

详细>>