IOS 聊一聊UIImage幾點知識

2021-06-26 11:52:38 字數 2776 閱讀 4885

有一段時間沒有寫部落格了,中間隔了個五一假,算一下差不多20天,這段時間準備組內的乙個分享,所以就耽擱了,今天準備寫一些uiimage方面的東西。

uiimage是ios中層級比較高的乙個用來載入和繪製影象的乙個類,更底層的類還有cgimage,以及ios5.0以後新增加的ciimage。今天我們主要聊一聊uiimage的三個屬性: imageorientation, size, scale,幾個初始化的方法: imagenamed,imagewithcontentsoffile,以及繪製image的幾個draw開頭的方法。

一、uiimage的size,scale屬性

先想乙個問題「乙個影象的尺寸到底是多大呢?」

第一反應可能就是image.size,恭喜你答錯了,正確的答案是影象的實際的尺寸(畫素)等於image.size乘以image.scale。如果做過介面貼圖的話你可能經常會需要準備至少兩套圖,一套1倍圖,一套圖已@2x命名的二倍圖。這樣當我們的程式執行在retina螢幕的時候系統就會自動的去載入@2x的,它的size將和一倍圖載入進來的size相等,但是scale卻置為2,這點大家可以做個簡單的小測試驗證一下。然我們再深入一點兒為什麼不直接載入到成二倍的尺寸呢,原因很簡單因為我們在介面布局中邏輯座標系中的(單位是point),而實際的繪製都是在裝置座標系(單位是pixel)進行的,系統會自動幫我們完成從point到pixel之間的轉化。其實這個比例也就剛好和uiscreen中的scale對應,這樣整條scale的線就可以串通了。

二、uiimage的幾種初始化方法的對比

1、imagenamed:方法

imagenamed:是uiimage的乙個類方法,它做的事情比我們看到的要稍微多一些。它的載入流程如下:

a. 系統回去檢查系統快取中是否存在該名字的影象,如果存在則直接返回。

b. 如果系統快取中不存在該名字的影象,則會先載入到快取中,在返回該物件。

觀察上面的操作我們發現系統會快取我們使用imagenamed:方法載入的影象時候,系統會自動幫我們快取。這種機制適合於那種頻繁用到介面貼圖累的載入,但如果我們需要短時間內頻繁的載入一些一次性的影象的話,最好不要使用這種方法。

2、imagewithcontentsoffile:和init

withcontentsoffile:方法

這兩個方法跟前乙個方法一樣都是完成從檔案載入影象的功能。但是不會經過系統快取,直接從檔案系統中載入並返回。

順便提一下,當收到記憶體警告的時候,系統可能會將uiimage內部的儲存影象的記憶體釋放,下一次需要繪製的時候會重新去載入。

3、imagewithcgimage:scale:orientation:方法

該方面使用乙個cgimageref建立uiimage,在建立時還可以指定方法倍數以及旋轉方向。當scale設定為1的時候,新建立的影象將和原影象尺寸一摸一樣,而orientaion則可以指定新的影象的繪製方向。

三、uiimage的imageorientation屬性

uiimage有乙個imageorientation的屬性,主要作用是控制image的繪製方向,共有以下8中方向:

typedef ns_enum(nsinteger, uiimageorientation) ;
預設的方向是uiimageorientationup,這8種方向對應的繪製方如上面所示。我們在日常使用中經常會碰到把iphone相簿中的**匯入到windows中,發現方向不對的問題就是與這個屬性有關,因為匯出**的時候,寫exif中的方向資訊時候沒有考慮該方向的原因。既然這個屬性可以控制image的繪製方向,那我們能不能通過改過這個屬性來完成uiimage的旋轉和翻轉呢?帶著這個問題我們繼續往下看。

四、uiimage的幾個draw方法

uiimage的幾個draw方法是用來繪製影象的利器,為什麼這樣說呢?因為它們在繪製影象的時候會考慮當前影象的方向,即根據的imageorientation繪製出不同的方向。由於影象是繪製在當前context中的,它同時還會考慮到當前context的transform的變化。利於這兩點我們就可以玩轉影象的旋轉和翻轉了。

搜尋了一些,目前網上大部分影象旋轉都是通過建立cgbitmapcontext,然後根據影象方向設定context的transform來實現的,這種方法要求對整個矩陣變化的過程都非常清楚,乙個引數設定不多,出來的結果就會有問題。

下面我介紹一種實現起來簡單方便的影象旋轉方法,這種方法主要就是利用imagewithcgimage:scale:orientation:方法,指定不同的orientation來完成所需要的功能,先舉個簡單的例子:

假設一副顯示為 

下面是影象旋轉和翻轉的完整**:

uiimage+rotate_flip.h

uiimage+rotate_flip.m

以上只是實現了影象的順時針90°,逆時針90°,180°旋轉,以及水平翻轉,數值翻轉等。至於任意角度旋轉怎麼實現?其實也很簡單,留著給大家思考吧。雖然我們可以通過orientation這種方法簡單的完成影象旋轉,但是如果有時間的話還是建議大家盡量的看一下那種通過transform來完成旋轉的**,你會徹底搞清楚旋轉矩陣是怎麼回事兒。當然程式中使用的時候推薦使用我上面提供的這種方法,因為不涉及真實的旋轉操作,速度會快很多。

通過上面的小例子,我們可以看出越高階別的api幫助我們做的事情就越多,越底層的api提供了更多的靈活性,但同時也帶來了很多需要我們處理的東西。再程式設計的過程中盡量的使用高階別的api,同時最好能搞懂底層的實現機制。這樣我們的程式才會更高效,出了問題才知道去**查詢。

IOS 聊一聊UIImage幾點知識

uiimage是ios中層級比較高的乙個用來載入和繪製影象的乙個類,更底層的類還有cgimage,以及ios5.0以後新增加的ciimage。今天我們主要聊一聊uiimage的三個屬性 imageorientation,size,scale,幾個初始化的方法 imagenamed,imagewith...

聊一聊iOS的惰性計算

有乙隻小白兔,跑到蔬菜店裡問老闆 老闆,有100個胡蘿蔔嗎?老闆說 沒有那麼多啊。小白兔失望的說道 哎,連100個胡蘿蔔都沒有。第二天小白兔又來到蔬菜店問老闆 今天有100個胡蘿蔔了吧?老闆尷尬的說 今天還是缺點,明天就能好了。小白兔又很失望的走了。第三天小白兔剛一推門,老闆就高興的說道 有了有了,...

聊一聊小甜餅

cookies程式設計 cookie是儲存在客戶端的小文字,儲存的位置分為兩種 cookie可能儲存在客戶端瀏覽器的所佔記憶體中,關閉瀏覽器後,cookies就不再存在。cookie也可能儲存在客戶pc機的硬碟上,設定有效時間,超過有效時間後失效。cookie的常見應用 簡化登入 很多 在登入時,可...