關於Kingfisher 備用

2021-09-07 03:59:31 字數 3377 閱讀 4396

本文將詳盡的對所涉及到的知識點進行講解,但由於筆者水平有限,失誤和遺漏之處在所難免,懇請前輩們批評指正。

magic number 是用於區分不同檔案格式,被放置於檔案首的標記資料。kingfisher 中用它來區分不同的格式,如png、jpg、gif。**如下:

**上部定義的 imageheader,就是不同格式放置在檔案首的對應 magic number 資料,我們通過 nsdata 的 getbytes: 方法得到資料的 magic number,通過比對確定格式。

我們知道 png 以及 jpeg 等格式的對原圖進行了壓縮,必須要將其資料解碼成位圖之後才能使用,這是原因,kingfisher 裡提供了用於解碼的函式,**如下:

// mark: - decode

extension uiimage func kf_decodedimage(scale scale: cgfloat) -> uiimage? else } }

這段**的主要含義是通過 cgbitmapcontextcreate 以及 cgcontextdrawimage 函式,將被壓縮的畫在 context 上,再通過呼叫 cgbitmapcontextcreateimage 函式,即可完成對被壓縮的解碼。但通過測試後續**發現,包含 decode 函式的分支從來沒被呼叫過,據本人推測,uiimage 在接收 nsdata 資料進行初始化的時候,其本身很可能包含有通過 magic number 獲知格式後,解碼並展示的功能,並不需要外部解碼。

// mark: - normalization

extension uiimage uigraphicsbeginimagecontextwithoptions(size, false, scale) drawinrect(cgrect(origin: cgpointzero, size: size)) let normalizedimage = uigraphicsgetimagefromcurrentimagecontext() uigraphicsendimagecontext() return normalizedimage; } }

如果該方向為正立,返回自身;否則將其用 core graphics 繪製,返回正立後的。

我們知道,uiimage 並不能直接儲存,需要先將其轉化為 nsdata 才能寫入硬碟以及記憶體中快取起來,uikit 提供了兩個 c 語言函式:uiimagejpegrepresentation 和 uiimagepngrepresentation,以便於將 jpg 及 png 格式的轉化為 nsdata 資料,但卻並沒有提供相應的 uiimagegifrepresentation,所以我們需要自己編寫這個函式以完成對gif資料的儲存,**如下:

import imageio

import mobilecoreservices

// mark: - gif func uiimagegifrepresentation(image: uiimage) -> nsdata? func uiimagegifrepresentation(image: uiimage, duration: nstimeinterval, repeatcount: int) -> nsdata? let framecount = images.count let gifduration = duration <= 0.0 ? image.duration / double(framecount) : duration / double(framecount) let frameproperties = [kcgimagepropertygifdictionary as string: [kcgimagepropertygifdelaytime as string: gifduration]] let imageproperties = [kcgimagepropertygifdictionary as string: [kcgimagepropertygifloopcount as string: repeatcount]] let data = nsmutabledata() guard let destination = cgimagedestinationcreatewithdata(data, kuttypegif, framecount, nil) else cgimagedestinationsetproperties(destination, imageproperties) for image in images return cgimagedestinationfinalize(destination) ? nsdata(data: data) : nil }

我們並不能像其他格式的一樣直接傳入 nsdata 給 uiimage 來建立乙個gif**,而是需要使用 uiimage 的 animatedimagewithimages 方法,但此函式所需的引數是 [uiimage],所以我們需要首先將 nsdata 格式的資料拆分為每一幀的靜態,再將其傳入上述函式之中,**如下:

extension uiimage {

static func kf_animatedimagewithgifdata(gifdata data: nsdata) -> uiimage? {

md5加密在 kingfisher 中被用於快取時對檔名的加密,由於其內部實現較為複雜,此處僅提供成品**以備不時之需,**如下:

import foundation

extension string {

func kf_md5() -> string {

Kingfisher原始碼閱讀 一

kingfisher github位址 kingfisher是swift語言編寫的一款非常受歡迎的載入庫,功能和oc語言編寫的sdwebimage類似。作者貓神是我初入ios開發到現在都很崇拜的偶像。imageview.kf.setimage with imageurl 複製 從上面的使用方法可以看...

遊戲備用資料

36以前的跳過,那個你都做不到,不用往下看了!卓越炎煌5 狼神5 5個鐵魁王的牙齒 卓越炎煌6 黑風5 水月5 10個炎煌的角 11個靈石 黑風6 卓越炎煌10 黑風10 1個水月進化石 22個靈石 極限炎煌1 極限炎煌5 大將軍5 10個炎煌的角 11個靈石 極限炎煌6 黑鰭5 水月5 10個炎煌...

資料整理(備用)

個人網頁 機器學習 深度學習 數學實用工具 筆試面試 本篇用來收集整理各類資料,不定期更新 利用python進行資料分析 第2版 本書主要通過python學習numpy matplotlib pandas等庫的使用 彙總 python機器學習及實踐 從零開始通往kaggle競賽之路 機器學習 周志華...