當前位置:編程學習大全網 - 編程語言 - iOS圖像處理之UI,CG和CI

iOS圖像處理之UI,CG和CI

UIImage雖然可以加載、顯示各種格式的位圖,甚至可以同時加載圖片,接下來依次播放多張圖片形成動畫。但UIImage不能對圖片進行縮放、旋轉,不能"挖取"源圖片的指定區域等,這些功能可借助Quartz 2D的CGImageRef來實現。UIImage與CGImageRef之間可以相互轉換,CGImageRef並不是面向對象的API,也不是類,只是壹個指針類型,Quartz 2D對CGImageRef的定義為:

CGImage和CGImageRef是用來重繪圖形的類,它們在應用時是按照圖像的像素矩陣來繪制圖片的,它們可以用來處理bitmap。

系統會維護壹個CGContextRef的棧,而UIGraphicsGetCurrentContext()會取棧頂的CGContextRef,正確的做法是只在drawRect裏調用UIGraphicsGetCurrentContext(),因為在drawRect之前,系統會往棧裏面壓入壹個valid的CGContextRef,除非自己去維護壹個CGContextRef,否則不應該在其他地方取CGContextRef。

UIColor是UIKit中存儲顏色信息的壹個重要的類,壹個UIColor對象包含了顏色和透明度的值,它的顏色空間已經針對iOS進行了優化。UIColor包含了壹些類方法用於創建壹些最常見的顏色,如白色,黑色,紅色,透明色等,這些顏色的色彩空間也不盡相同(白色和黑色是kCGColorSpaceDeviceGray,紅色的色彩空間是kCGColorSpaceDeviceRGB)。UIColor有兩個重要的屬性:壹個是CGColor,壹個是CIColor(5.0之後添加)。

CGColor主要用於CoreGaphics框架之中,CGColor其實是個結構體,而我們通常在使用的CGColor的時候使用的是它的引用類型CGColorRef。CGColor主要由CGColorSapce和Color Components兩個部分組成,同樣的顏色組成,如果顏色空間不同的話,解析出來的結果可能會有所不同。這就像我們在處理圖片數據的時候,如果把RGBA格式當成BGRA格式處理的結果可想而知。在Quartz 2D中CGColor常用來設置context的填充顏色,設置透明度等。

CIColor主要用於和Core Image框架中其他類交互,比如CIFilter,CIContext以及CIImage。CIColor中顏色值的範圍是0.0-1.0之間,0.0代表該顏色分量為最小值,1.0代表改顏色分量為最大值。其中alpha值的範圍也是0.0到1.0之間,0.0代表全透明,1.0代表完全不透明,CIColor的顏色分量通常都是沒有乘以alpha值。可以使用initWithCGColor:函數,通過CGColor創建壹個CIColor。其中傳入的CGColorRef對象可以使任何任何顏色空間,但是Core Image框架會在傳入filter kernel之前把所有的顏色空間轉換到Core Image工作顏色空間。Core Image工作顏色空間使用三個顏色分量加上壹個alpha分量組成(其實就是kCGColorSpaceDeviceRGB)。

UIColor的CGColor總是有效的,不管它是通過CGColor,CIColor,還是其他方法創建的,CGColor屬性都總是有效的;但是CIColor屬性就不總是有效的,只有當UIColor是通過CIColor創建的時候,它才是有效的,否則訪問該屬性將會拋出異常。

當UIColor使用CGColor初始化的時候,所有CGColorRef包含的信息,都會被原封不動的保留,其中就包括Color space,而且通過下面的小例子我們還可以看到如果使用CGColor初始化UIColor的時候,UIColor其實是直接保留了壹份這個CGColorRef對象。

當使用CIColor來初始化壹個UIColor的時候,再去訪問UIColor的CGColor屬性的時候,我們會發現 CGColor的color Space和設置CIColor的color space的是不完全壹樣的 ,在這個過程中CIColor會為我們做壹個轉換。使用kCGColorSpaceDeviceGray,kCGColorSpaceDeviceRGB,kCGColorSpaceDeviceCMYK三種顏色空間來初始化壹個CIColor的時候,再去使用該CIColor去初始化壹個UIColor,然後在去訪問其CIColor屬,CGColor屬性,查看顏色空間並打印顏色信息。

通過運行程序,我們看出來,如果使用壹個kCGColorSpaceDeviceGray的顏色空間的CGColor來初始化CIColor的時候,我們可以看到CIColor的色彩空間壹直是kCGColorSpaceDeviceGray,通過訪問UIColor的CIColor屬性,我們可以看到其顏色空間仍然是kCGColorSpaceDeviceGray,但是當訪問UIColor的CGColor屬性的時候,通過打印可以發現其色彩空間已經轉變成了kCGColorSpaceDeviceRGB空間了,而顏色值也正確的從原來的顏色空間轉換到了新的顏色空間。

整個過程中CIColor,以及通過UIColor的CGColor和CIColor屬性訪問到的值,打印出來我們可以發現它們都是kCGColorSpaceDeviceRGB空間的。

當我們用壹個CMYK顏色空間的CGColor來初始化CIColor的時候,CIColor的顏色空間依然是CMYK,但是顏色值已經轉換成RGB的顏色值。當使用該CIColor創建壹個UIColor的時候,我們再通過CIColor和CGColor屬性打印信息的時候,我們會發現CIColor的色彩空間依然是CMYK,但是CGColor打印所得到的信息說明它已經被轉換成RGB空間了。

關於創建壹個CGColor

最常用的函數是CGColorCreate,該函數有兩個參數:

該函數該返回壹個新創建的CGColorRef,當我們不再使用該對象的時候使用CGColorRelease函數釋放該對象。

獲取CGColor的數據

在我們創建的時候傳入兩個重要的參數進去,當我們獲取到了CGColorRef以後當然就可以拿到對應的ColorSpace以及Components。

第壹個函數是獲得CGColorRef的中包含的顏色組成部分的個數,第二個函數就是獲取實際的顏色組成部分的數組。

判斷兩個顏色是否相等

不管UIColor使用CIColor,CGColor還是其他方式初始化的,其CGColor屬性都是可用的。CoreGraphics中提供壹個方法可以判斷兩個CGColor是否相等,因此我們可以通過判斷兩個UIColor是否相等。

例子中第壹部分是判斷兩個白色的UIColor是否相等,雖然都是白色,但是顏色空間是不壹樣的。例子的第二部分簡單的創建了兩個RGB空間的UIColor,運行程序可以看出,這兩種顏色是相同的。

  • 上一篇:大小余號怎麽看
  • 下一篇:wpsupdate.exe—應用程序錯誤 "0x7c938af2"指令引用的"0x01cae6aa"內存。該內存不能為"written"。
  • copyright 2024編程學習大全網