什么是WebP绷跑?
WebP,是一種同時提供了有損壓縮與無損壓縮的圖片文件格式驼修,是Google新推出的影像技術盆犁,它可讓網(wǎng)頁圖檔有效進行壓縮退敦,同時又不影響圖片格式兼容與實際清晰度,進而讓整體網(wǎng)頁下載速度加快蚣抗。
- WebP 無損壓縮的圖片可以比同樣大小的 PNG 小 26%;
- WebP 有損壓縮的圖片可以比同樣大小的 JPEG 小 25-34%瓮下;
- WebP 支持無損的透明圖層通道翰铡,代價只需增加 22% 的字節(jié)存儲空間;
- WebP 有損透明圖像可以比同樣大小的 PNG 圖像小3倍讽坏。
WebP對比GIF的優(yōu)勢:
- 支持有損和無損壓縮锭魔,并且可以合并有損和無損圖片幀
- 體積更小,GIF 轉(zhuǎn)成有損 WebP 后可以減小 64% 的體積路呜,轉(zhuǎn)成無損可以節(jié)省 19% 的體積
- 顏色更豐富迷捧,支持 24-bit 的 RGB 顏色以及 8-bit 的 Alpha 透明通道(而 GIF 只支持 8-bit RGB 顏色以及 1-bit 的透明)
- 添加了關鍵幀、metadata 等數(shù)據(jù)
WebP對比GIF的劣勢:
- 消耗較多的 CPU 和解碼時間(多 1.5~2.2 倍)
- UIWebView無法加載(需通過NSUrlProtocol來處理)
- 壓縮時間長胀葱,大概是png的8倍左右(不過一般都是在服務端壓縮漠秋,客戶端解碼,所以服務端可以做個預壓縮)
SDImageWebPCoder加載WebP:
#import <SDWebImageWebPCoder/UIImage+WebP.h>
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"bigGif" ofType:@"webp"];
NSData *data = [NSData dataWithContentsOfFile:imagePath];
self.redImgView.image = [UIImage sd_imageWithWebPData:data];
YYImage加載WebP:
#import "YYImage.h"
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"bigGif" ofType:@"webp"];
NSData *data = [NSData dataWithContentsOfFile:imagePath];
self.redImgView.image = [YYImage imageWithData:data];
SDImageWebPCoder解析WebP原理:
YYImage解析WebP原理:
SDImageWebPCoder總結(jié):
- 先把WebP所有幀都解析完抵屿,才渲染庆锦,解析時間比較長(13M的WebP,解析需要28s)
-解析的時候轧葛,會占用較高的CPU和內(nèi)存(注意解析放到子線程)- 解析完成后搂抒,會釋放CPU和內(nèi)存
- 通過CoreGraphics繪制,減少緩存的內(nèi)存(13M的WebP尿扯,緩存到內(nèi)存中才占用2M)
YYImage總結(jié):
- 每一幀解析完后馬上顯示求晶,若每幀渲染時間>每幀的播放時間則會卡頓
- 長期占用CPU和內(nèi)存,需要手動釋放(因為WebP動圖播放的時候衷笋,會不斷的解析每一幀)
- 解析時間比較快(因為是一幀一幀的解析)
基于SDImageWebPCoder占用內(nèi)存少和YYImage解析速度快的優(yōu)點芳杏,總結(jié)加載方案如下:
- SDImageWebPCoder在子線程對WebP解碼
- 在SDImageWebPCoder未解碼成功之前,使用YYImage加載WebP
- 在SDImageWebPCoder解碼成功后,緩存到內(nèi)存蚜锨,直接使用SDImageWebPCoder解析后的UIImage