1. 程式人生 > 其它 >CGBitmapContextCreate函式引數詳解

CGBitmapContextCreate函式引數詳解

函式原型:

CGContextRef CGBitmapContextCreate (

void *data,
size_t width,
size_t height,
size_t bitsPerComponent,
size_t bytesPerRow,
CGColorSpaceRef colorspace,
CGBitmapInfo bitmapInfo

);

引數:

data 指向要渲染的繪製記憶體的地址。這個記憶體塊的大小至少是(bytesPerRow*height)個位元組

width bitmap的寬度,單位為畫素

height bitmap的高度,單位為畫素

bitsPerComponent 記憶體中畫素的每個元件的位數.例如,對於32位畫素格式和RGB 顏色空間,你應該將這個值設為8.

bytesPerRow bitmap的每一行在記憶體所佔的位元數

colorspace bitmap上下文使用的顏色空間。

bitmapInfo 指定bitmap是否包含alpha通道,畫素中alpha通道的相對位置,畫素元件是整形還是浮點型等資訊的字串。

描述:

當你呼叫這個函式的時候,Quartz建立一個位圖繪製環境,也就是點陣圖上下文。當你向上下文中繪製資訊時,Quartz把你要繪製的資訊作為點陣圖資料繪製到指定的記憶體塊。一個新的點陣圖上下文的畫素格式由三個引數決定:每個元件的位數,顏色空間,alpha選項。alpha值決定了繪製畫素的透明性。

      1. Implicitconversionfromenumerationtype'enumCGImageAlphaInfo'todifferentenumerationtype'CGBitmapInfo'(aka'enumCGBitmapInfo')
      2. 在使用xcode5sdkiOS7環境,建立圖形上下文進行圖形繪製,合併,裁剪,特效處理等時避免不了使用如下方法建立點陣圖:
      3. 在iOS7以前,是使用如下方法建立的:
      4. CG_EXTERNCGContextRefCGBitmapContextCreate(voidvoid*data,size_twidth,
      5. size_theight,size_tbitsPerComponent,size_tbytesPerRow,
      6. CGColorSpaceRefspace,CGImageAlphaInfobitmapInfo)
      7. 注意最後一個引數型別是CGImageAlphaInfo列舉型別中的kCGImageAlphaPremultipliedLast值。其整型值為1。
      8. typedefCF_ENUM(uint32_t,CGImageAlphaInfo)
      9. {
      10. kCGImageAlphaNone,/*Forexample,RGB.*/
      11. kCGImageAlphaPremultipliedLast,/*Forexample,premultipliedRGBA*/
      12. kCGImageAlphaPremultipliedFirst,/*Forexample,premultipliedARGB*/
      13. kCGImageAlphaLast,/*Forexample,non-premultipliedRGBA*/
      14. kCGImageAlphaFirst,/*Forexample,non-premultipliedARGB*/
      15. kCGImageAlphaNoneSkipLast,/*Forexample,RBGX.*/
      16. kCGImageAlphaNoneSkipFirst,/*Forexample,XRGB.*/
      17. kCGImageAlphaOnly/*Nocolordata,alphadataonly*/
      18. };
      19. 但是在iOS7版本中,這個最後的參會型別發生了變化。看一下定義:
      20. CGContextRefCGBitmapContextCreate(voidvoid*data,size_twidth,
      21. size_theight,size_tbitsPerComponent,size_tbytesPerRow,
      22. CGColorSpaceRefspace,CGBitmapInfobitmapInfo)
      23. 很明顯最後一個引數由CGImageAlphaInfo變化為CGBitmapInfo,看一下這個型別的定義
      24. typedefCF_OPTIONS(uint32_t,CGBitmapInfo)
      25. {
      26. kCGBitmapAlphaInfoMask=0x1F,
      27. kCGBitmapFloatComponents=(1<<8),
      28. kCGBitmapByteOrderMask=0x7000,
      29. kCGBitmapByteOrderDefault=(0<<12),
      30. kCGBitmapByteOrder16Little=(1<<12),
      31. kCGBitmapByteOrder32Little=(2<<12),
      32. kCGBitmapByteOrder16Big=(3<<12),
      33. kCGBitmapByteOrder32Big=(4<<12)
      34. }CF_ENUM_AVAILABLE(10_4,2_0);
      35. 從頭到尾沒有發現值為1的列舉量值。故在使用的時候會出現如下警告:
      36. Implicitconversionfromenumerationtype'enumCGImageAlphaInfo'todifferentenumerationtype'CGBitmapInfo'(aka'enumCGBitmapInfo')
      37. 意思很明顯不過,型別不匹配非法。
      38. 以下給出解決方法:
      39. 第一種方法,定義巨集:
      40. #if__IPHONE_OS_VERSION_MAX_ALLOWED>__IPHONE_6_1
      41. #definekCGImageAlphaPremultipliedLast(kCGBitmapByteOrderDefault|kCGImageAlphaPremultipliedLast)
      42. #else
      43. #definekCGImageAlphaPremultipliedLastkCGImageAlphaPremultipliedLast
      44. #endif
      45. 這樣就會直接映射出一個值為1的巨集,原有方法不用改變。
      46. 第二種方法:原理和第一個一樣,目的還是為了生產出一個為1的值,直接修改程式碼。
      47. #if__IPHONE_OS_VERSION_MAX_ALLOWED>__IPHONE_6_1
      48. intbitmapInfo=kCGBitmapByteOrderDefault|kCGImageAlphaPremultipliedLast;
      49. #else
      50. intbitmapInfo=kCGImageAlphaPremultipliedLast;
      51. #endif
      52. CGContextRefcontext=CGBitmapContextCreate(nil,CGContexWith*2,290.0*2,8,4*CGContexWith*2,colorSpace,bitmapInfo);
      53. 其實所有的做法,不外乎為了使這裡的值為1,型別匹配。你也直接可以傳1,不用麻煩的各種寫程式碼。也可以直接進行型別強制轉換,這個你隨便。只是每個人的習慣不一樣,故,如何解決,自己參考決定。
      54. 轉載自:http://hi.baidu.com/yunhuaikong/item/0fe2ccca5f041c7289ad9eac