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