IOS:談談UIImage的一些知識?
有一段時間沒寫博客了,中間隔了一個五一假期,差不多20天。在此期間,我準備在小組中分享,所以我推遲了。今天,我要寫一些關于UIImage的東西。
在IOS中,UIImage是一個較高層次的類別,用于載入和繪制圖像,更低層次的類別是CGImage,以及IOS5.0后新增的CIImage。現(xiàn)在我們主要談談UIImage的三個特點: imageOrientation, size, scale,一些初始化方法: imageNamed,imageWithContentsOfFile,以及幾種draw開頭繪制Image的方法。
首先,UIImagesize,scale特性
首先想一個問題:“一個圖像的大小到底有多大?”
image的第一反應可能是.size,恭喜你答錯了,正確的答案是圖像的實際尺寸(像素)等于image。.乘以image乘以size.scale。假如你做過界面貼圖,你可能會經(jīng)常準備至少兩套圖片,一套1倍圖片,一套圖片已經(jīng)被@2x命名為2倍圖片。這樣,當我們的程序在retina屏幕上運行時,系統(tǒng)會自動加載@2x的照片,它的size會和加載一倍圖的size一樣,但scale是2,這可以通過一個簡單的小測試來驗證。但是,為什么我們不直接將其載入兩倍的尺寸呢?原因很簡單,因為我們邏輯坐標系(單位為point)在界面布局中,實際繪制是在設備坐標系(單位為pixel)中進行的,系統(tǒng)會自動幫助我們完成從point到pixel的轉(zhuǎn)換。事實上,這一比例正好與UIScreen中的scale相對應,這樣整個scale的線條就可以串通了。
對比幾種初始化方法的UIImage。
1、imageNamed:方法
imageNamed:這是UIImage的一種方法,它比我們看到的要多一點。其載入過程如下:
a. 檢查系統(tǒng)緩存中是否存在該名稱的圖像,如果出現(xiàn)這種情況,直接返回。
b. 假如在系統(tǒng)緩存中有這個名字的圖像,那么就會先載入緩存,然后再回到這個目標。
通過觀察上面的操作,我們發(fā)現(xiàn)系統(tǒng)會緩存我們使用imageNamed:當方法載入圖像時,系統(tǒng)會自動幫助我們緩存。這種機制適用于頻繁使用界面貼圖的載入,但如果需要在短時間內(nèi)頻繁載入一些一次性圖像,盡量不要使用這種方法。
2、imageWithContentsOfFile:和initWithContentsOfFile:方法
與前一種方法一樣,這兩種方法都可以完成從文件中加載圖像的功能。但是,它不會通過系統(tǒng)緩存,而是直接加載到文件系統(tǒng)中并返回。
順便說一下,當接到內(nèi)存警告時,系統(tǒng)可能會釋放UIImage內(nèi)部存儲圖像的內(nèi)存,并在下一次需要繪制時重新加載。
3、imageWithCGImage:scale:orientation:方法
在這方面,使用CGImageRef來建立UIImage,在創(chuàng)建時也可以指定方法倍率和旋轉(zhuǎn)方向。當scale設置為1時,新創(chuàng)建的圖像將與原始圖像大小相同,而orientaion則可以指定繪制新圖像的方向。
UIImage的imageOrientation特性
UIImage具有imageOrientation的屬性,其主要功能是控制image的繪制方向,共有以下8個方向:
typedef NS_ENUM(NSInteger, UIImageOrientation) {
UIImageOrientationUp, // default orientation
UIImageOrientationDown, // 180 deg rotation
UIImageOrientationLeft, // 90 deg CCW (在官方文檔中,編程發(fā)現(xiàn)left和right圖像標反,在此更正)
UIImageOrientationRight, // 90 deg CW
UIImageOrientationUpMirrored, // as above but image mirrored along other axis. horizontal flip
UIImageOrientationDownMirrored, // horizontal flip
UIImageOrientationLeftMirrored, // vertical flip
UIImageOrientationRightMirrored, // vertical flip
默認方向是UIImageorientationup,這八個方向?qū)睦L制方如上圖所示。在日常使用中,我們經(jīng)常會遇到在windows中導入iPhone相冊中的照片,發(fā)現(xiàn)方向不對的問題在于與這一特性有關,因為在導出照片時,在寫exif中的方向信息時,并沒有考慮到這一角度。因為這一特性可以控制image的繪制方向,所以我們可以通過改變這一特性來完成UIImage的旋轉(zhuǎn)和旋轉(zhuǎn)嗎?帶著這個問題,我們繼續(xù)往下看。
UIImage的幾種draw方法?
UIImage的幾種draw方法都是用來繪制圖像的利器,為什么要這么說?由于它在繪制圖像時會考慮當前圖像的方向,即根據(jù)imageOrientation繪制不同的方向。由于圖像是在當前的context中繪制的,它還會考慮當前contexttransform的變化。有利于這兩點,我們可以玩轉(zhuǎn)圖像的旋轉(zhuǎn)和旋轉(zhuǎn)。
目前網(wǎng)上大部分圖像旋轉(zhuǎn)都是通過建立CGBitmapContext,然后根據(jù)圖像方向設置contexttransform來完成的,這種方法需要對整個矩陣的變化過程非常清楚,一個基本參數(shù)不多,結(jié)果就會出現(xiàn)問題。
以下是一種簡單方便的圖像旋轉(zhuǎn)方法,主要是通過imageWithCGImage來實現(xiàn)的。:scale:orientation:為了完成所需的功能,指定不同的orientation,首先舉一個典型的例子:
,我們將向左旋轉(zhuǎn)90°,所以轉(zhuǎn)過之后應該會顯示出來。
,將原圖從orientationUP轉(zhuǎn)換為orientationLeft。以此類推為不同方向的旋轉(zhuǎn),只需仔細觀察R的顯示,這樣在實現(xiàn)整個旋轉(zhuǎn)和旋轉(zhuǎn)的過程中就可以完全不考慮Transform那些東西,是否很簡單。
以下是圖像旋轉(zhuǎn)和旋轉(zhuǎn)的完整代碼:
UIImage Rotate_Flip.h
UIImage Rotate_Flip.m
上述順時針90只完成了圖像?!悖鏁r針90°,180°旋轉(zhuǎn),水平翻轉(zhuǎn),數(shù)值旋轉(zhuǎn)等等。如何實現(xiàn)隨意視角轉(zhuǎn)動?實際上也很簡單,留給大家思考吧。雖然我們可以通過orientation簡單地完成圖像旋轉(zhuǎn),但是如果我們有時間,我們建議盡可能多地閱讀通過transform完成旋轉(zhuǎn)的代碼,這樣你就可以完全找出旋轉(zhuǎn)矩陣是怎么回事。當然,在使用系統(tǒng)時,建議使用我上面提供的這種方法,因為不涉及真正的旋轉(zhuǎn)操作,速度會快很多。
通過以上小例子,我們不難發(fā)現(xiàn),API越高,幫助我們做的事情就越多。API越低,提供的靈活性就越多,但同時也帶來了很多需要我們處理的東西。在重新編程的過程中,盡量使用高級API,最好了解底層的實現(xiàn)機制。只有這樣,我們的程序才能更有效率,我們才能知道在哪里發(fā)現(xiàn)問題。
本文僅代表作者觀點,版權歸原創(chuàng)者所有,如需轉(zhuǎn)載請在文中注明來源及作者名字。
免責聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權或非授權發(fā)布,請及時與我們聯(lián)系進行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com

