亚洲欧美日韩熟女|做爱高潮视频网址|国产一区二区三级片|国产Av中文字幕www.性色av|亚洲婷婷永久免费|国产高清中文字幕|欧美变态网站久re视频精品|人妻AV鲁丝第一页|天堂AV一区二区在线观看|综合 91在线精品

IOS:談?wù)刄IImage的一些知識(shí)?

2023-05-22


有一段時(shí)間沒寫博客了,中間隔了一個(gè)五一假期,差不多20天。在此期間,我準(zhǔn)備在小組中分享,所以我推遲了。今天,我要寫一些關(guān)于UIImage的東西。


在IOS中,UIImage是一個(gè)較高層次的類別,用于載入和繪制圖像,更低層次的類別是CGImage,以及IOS5.0后新增的CIImage?,F(xiàn)在我們主要談?wù)刄IImage的三個(gè)特點(diǎn): imageOrientation, size, scale,一些初始化方法: imageNamed,imageWithContentsOfFile,以及幾種draw開頭繪制Image的方法。



首先,UIImagesize,scale特性


首先想一個(gè)問(wèn)題:“一個(gè)圖像的大小到底有多大?”


image的第一反應(yīng)可能是.size,恭喜你答錯(cuò)了,正確的答案是圖像的實(shí)際尺寸(像素)等于image。.乘以image乘以size.scale。假如你做過(guò)界面貼圖,你可能會(huì)經(jīng)常準(zhǔn)備至少兩套圖片,一套1倍圖片,一套圖片已經(jīng)被@2x命名為2倍圖片。這樣,當(dāng)我們的程序在retina屏幕上運(yùn)行時(shí),系統(tǒng)會(huì)自動(dòng)加載@2x的照片,它的size會(huì)和加載一倍圖的size一樣,但scale是2,這可以通過(guò)一個(gè)簡(jiǎn)單的小測(cè)試來(lái)驗(yàn)證。但是,為什么我們不直接將其載入兩倍的尺寸呢?原因很簡(jiǎn)單,因?yàn)槲覀冞壿嬜鴺?biāo)系(單位為point)在界面布局中,實(shí)際繪制是在設(shè)備坐標(biāo)系(單位為pixel)中進(jìn)行的,系統(tǒng)會(huì)自動(dòng)幫助我們完成從point到pixel的轉(zhuǎn)換。事實(shí)上,這一比例正好與UIScreen中的scale相對(duì)應(yīng),這樣整個(gè)scale的線條就可以串通了。



對(duì)比幾種初始化方法的UIImage。


1、imageNamed:方法


imageNamed:這是UIImage的一種方法,它比我們看到的要多一點(diǎn)。其載入過(guò)程如下:


a. 檢查系統(tǒng)緩存中是否存在該名稱的圖像,如果出現(xiàn)這種情況,直接返回。


b. 假如在系統(tǒng)緩存中有這個(gè)名字的圖像,那么就會(huì)先載入緩存,然后再回到這個(gè)目標(biāo)。


通過(guò)觀察上面的操作,我們發(fā)現(xiàn)系統(tǒng)會(huì)緩存我們使用imageNamed:當(dāng)方法載入圖像時(shí),系統(tǒng)會(huì)自動(dòng)幫助我們緩存。這種機(jī)制適用于頻繁使用界面貼圖的載入,但如果需要在短時(shí)間內(nèi)頻繁載入一些一次性圖像,盡量不要使用這種方法。


2、imageWithContentsOfFile:和initWithContentsOfFile:方法


與前一種方法一樣,這兩種方法都可以完成從文件中加載圖像的功能。但是,它不會(huì)通過(guò)系統(tǒng)緩存,而是直接加載到文件系統(tǒng)中并返回。


順便說(shuō)一下,當(dāng)接到內(nèi)存警告時(shí),系統(tǒng)可能會(huì)釋放UIImage內(nèi)部存儲(chǔ)圖像的內(nèi)存,并在下一次需要繪制時(shí)重新加載。


3、imageWithCGImage:scale:orientation:方法


在這方面,使用CGImageRef來(lái)建立UIImage,在創(chuàng)建時(shí)也可以指定方法倍率和旋轉(zhuǎn)方向。當(dāng)scale設(shè)置為1時(shí),新創(chuàng)建的圖像將與原始圖像大小相同,而orientaion則可以指定繪制新圖像的方向。



UIImage的imageOrientation特性


UIImage具有imageOrientation的屬性,其主要功能是控制image的繪制方向,共有以下8個(gè)方向:










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,這八個(gè)方向?qū)?yīng)的繪制方如上圖所示。在日常使用中,我們經(jīng)常會(huì)遇到在windows中導(dǎo)入iPhone相冊(cè)中的照片,發(fā)現(xiàn)方向不對(duì)的問(wèn)題在于與這一特性有關(guān),因?yàn)樵趯?dǎo)出照片時(shí),在寫exif中的方向信息時(shí),并沒有考慮到這一角度。因?yàn)檫@一特性可以控制image的繪制方向,所以我們可以通過(guò)改變這一特性來(lái)完成UIImage的旋轉(zhuǎn)和旋轉(zhuǎn)嗎?帶著這個(gè)問(wèn)題,我們繼續(xù)往下看。



UIImage的幾種draw方法?


UIImage的幾種draw方法都是用來(lái)繪制圖像的利器,為什么要這么說(shuō)?由于它在繪制圖像時(shí)會(huì)考慮當(dāng)前圖像的方向,即根據(jù)imageOrientation繪制不同的方向。由于圖像是在當(dāng)前的context中繪制的,它還會(huì)考慮當(dāng)前contexttransform的變化。有利于這兩點(diǎn),我們可以玩轉(zhuǎn)圖像的旋轉(zhuǎn)和旋轉(zhuǎn)。


目前網(wǎng)上大部分圖像旋轉(zhuǎn)都是通過(guò)建立CGBitmapContext,然后根據(jù)圖像方向設(shè)置contexttransform來(lái)完成的,這種方法需要對(duì)整個(gè)矩陣的變化過(guò)程非常清楚,一個(gè)基本參數(shù)不多,結(jié)果就會(huì)出現(xiàn)問(wèn)題。


以下是一種簡(jiǎn)單方便的圖像旋轉(zhuǎn)方法,主要是通過(guò)imageWithCGImage來(lái)實(shí)現(xiàn)的。:scale:orientation:為了完成所需的功能,指定不同的orientation,首先舉一個(gè)典型的例子:


,我們將向左旋轉(zhuǎn)90°,所以轉(zhuǎn)過(guò)之后應(yīng)該會(huì)顯示出來(lái)。


,將原圖從orientationUP轉(zhuǎn)換為orientationLeft。以此類推為不同方向的旋轉(zhuǎn),只需仔細(xì)觀察R的顯示,這樣在實(shí)現(xiàn)整個(gè)旋轉(zhuǎn)和旋轉(zhuǎn)的過(guò)程中就可以完全不考慮Transform那些東西,是否很簡(jiǎn)單。


以下是圖像旋轉(zhuǎn)和旋轉(zhuǎn)的完整代碼:




UIImage Rotate_Flip.h     
   UIImage Rotate_Flip.m


上述順時(shí)針90只完成了圖像?!?,逆時(shí)針90°,180°旋轉(zhuǎn),水平翻轉(zhuǎn),數(shù)值旋轉(zhuǎn)等等。如何實(shí)現(xiàn)隨意視角轉(zhuǎn)動(dòng)?實(shí)際上也很簡(jiǎn)單,留給大家思考吧。雖然我們可以通過(guò)orientation簡(jiǎn)單地完成圖像旋轉(zhuǎn),但是如果我們有時(shí)間,我們建議盡可能多地閱讀通過(guò)transform完成旋轉(zhuǎn)的代碼,這樣你就可以完全找出旋轉(zhuǎn)矩陣是怎么回事。當(dāng)然,在使用系統(tǒng)時(shí),建議使用我上面提供的這種方法,因?yàn)椴簧婕罢嬲男D(zhuǎn)操作,速度會(huì)快很多。


通過(guò)以上小例子,我們不難發(fā)現(xiàn),API越高,幫助我們做的事情就越多。API越低,提供的靈活性就越多,但同時(shí)也帶來(lái)了很多需要我們處理的東西。在重新編程的過(guò)程中,盡量使用高級(jí)API,最好了解底層的實(shí)現(xiàn)機(jī)制。只有這樣,我們的程序才能更有效率,我們才能知道在哪里發(fā)現(xiàn)問(wèn)題。


本文僅代表作者觀點(diǎn),版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請(qǐng)?jiān)谖闹凶⒚鱽?lái)源及作者名字。

免責(zé)聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)及時(shí)與我們聯(lián)系進(jìn)行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com