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






