SDWebImage 載入顯示 WebP 與性能問題

来源:https://www.cnblogs.com/silence-cnblogs/archive/2018/01/20/8319917.html
-Advertisement-
Play Games

SDWebImage 載入顯示 WebP 與性能問題 本文包含自定義下載操作 SDWebImageDownloaderOperation 與編碼器 SDWebImageCoder。SDWebImage 的版本為 4.2.3。 靜態圖片 對於靜態圖片來說,WebP 比 PNG 體積小,可以省流量,但是 ...


SDWebImage 載入顯示 WebP 與性能問題

本文包含自定義下載操作 SDWebImageDownloaderOperation 與編碼器 SDWebImageCoder。SDWebImage 的版本為 4.2.3。

靜態圖片

對於靜態圖片來說,WebP 比 PNG 體積小,可以省流量,但是解碼時間長。如果不需要 WebP 的原圖數據,可以把 WebP 靜態圖片保存為 PNG 或 JPEG,加快解碼速度。這一步可以通過自定義下載操作 SDWebImageDownloaderOperation 實現。

SDWebImageDownloaderOperation 的 URLSession:task:didCompleteWithError: 方法會把下載好的原圖數據 imageData 通過 callCompletionBlocksWithImage:imageData:error:finished: 方法傳給上層的回調 SDWebImageDownloaderCompletedBlock。

可以自定義 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]];

動態圖片

WebP 格式支持動態圖片。SDWebImageWebPCoder 的 decodedImageWithData: 負責解碼,返回 UIImage。如果是動態圖片,每一幀圖片都會解碼,用所有圖片幀和總動畫時長通過 animatedImageWithImages:duration: 方法生成 UIImage。這樣做的好處是,節省 CPU 資源,不用重覆解碼。對小圖片來說,比較合適。如果圖片太大,就會占記憶體多。另外,如果原圖的每一幀動畫時長不相等,那麼實際播放的動畫就與原圖動畫不符。可以用 YYImage 和 YYAnimatedImageView 來顯示動態 WebP。這樣可以用 CPU 資源換取記憶體空間(YYImage 也可以預先解碼所有圖片幀),也可以根據原圖的每一幀動畫時長來播放動畫。直接使用 YYWebImage 框架是最方便的方法。然而,如果項目中需要統一圖片的下載、緩存管理等操作,最好只用一套圖片下載庫。這裡介紹用 SDWebImage 下載、緩存,用 YYImage 顯示 WebP 的方法。

YYImage 會對 WebP 進行解碼,因此不需要 SDWebImageWebPCoder 解碼所有圖片幀。自定義編碼器 SDWebImageCoder,只對第一幀圖片進行解碼,減少解碼時間。修改 decodedImageWithData: 方法,在解碼每一幀圖片的 while 迴圈中 (下圖箭頭所指處) 添加 break 即可,解碼成功一幀圖片就退出迴圈。

自定義編碼器的類是 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:https://github.com/Silence-GitHub/WebPDemo

轉載請註明出處:http://www.cnblogs.com/silence-cnblogs/p/8319917.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雙擊進入安裝,如下圖: 雙擊進入安裝,如下圖: 2 點擊上圖紅框“Install MySQL Products”進入安裝界面,如下圖: 點擊上圖紅框“Install MySQL Products”進入安裝界面,如下圖: 3 根據上圖當中第一步驟與第二步驟,進入下圖: 根據上圖當中第一步驟與第二步驟, ...
  • 日期轉換的兩個函數分別是to_date()和to_char(),to_date() 作用將字元類型按一定格式轉化為日期類型, to_char() 將日期轉按一定格式換成字元類型 其中當時間需要精確的時候,最好使用to_char()使用字元類型進行比較,比較方法(=、>=、 <=、between an ...
  • 1、Hive概念: hive是數據倉庫,由解釋器、優化器和編譯器組成;運行時,元數據存儲在關係型資料庫中。 2、Hive的架構: (1)用戶介面主要有三個:CLi、Client和WUI。其中最常用的是CLi,CLi啟動時候,會啟動一個Hive副本。Client是hive的客戶端,用戶連接至Hive ...
  • 強烈建議參閱鏈接:http://www.linezing.com/blog/?p=798#nav-1 說白了,索引問題就是一個查找問題。。。 資料庫索引,是資料庫管理系統中一個排序的數據結構,以協助快速查詢、更新資料庫表中數據。索引的實現通常使用B樹及其變種B+樹。 在數據之外,資料庫系統還維護著滿 ...
  • idea中使用scala運行spark出現: 查看build.sbt: 你需要確保 spark所使用的scala版本與你系統scala的版本一致 你也可以這樣: 那怎樣確認你的版本是否一致呢: 1 .首先查看你代碼使用的版本,這個就是從pom.xml中或者sbt配置文件中查看 確定你的使用版本 2. ...
  • 1.簡介 PCH文件是Xcode編程中全局引用共用的文件。可以在這裡引入頭文件或者巨集定義來方便程式中多個文件訪問。 2.PCH文件創建 打開工程 New File… -> iOS Other -> PCH File 輸入PCH文件名字即可 3. PCH 文件配置 a. 找到 Project > Bu ...
  • 1.判斷點擊的位置是否在某個NSRange範圍內 2.通過CFRange與CTFrameRef獲取要操作(塗色,劃線)的CGRect數組 3.塗色劃線 ...
  • 寫在前面 在我們操作頁面跳轉時,如果當前的類不是UIViewcontroller(下麵用VC表示),你會不會寫一個代理,或者block給VC傳遞信息,然後在VC裡面進行 拿tableViewCell做例子,如果每個頁面展示的tableViewCell中,如果存在不少的這樣操作,就會寫很多代理或者bl ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...