CGBitmapContext介紹

使用CGBitmapContextCreate創(chuàng)建繪制圖片的上下文


CGContextRef CGBitmapContextCreate (
  void *data,
  size_t width,
  size_t height第步,
  size_t bitsPerComponent收恢,
  size_t bytesPerRow席覆,
  CGColorSpaceRef colorspace橄浓,
  CGBitmapInfo bitmapInfo
  );
  • 參數(shù)data指向繪圖操作被渲染的內存區(qū)域土童,這個內存區(qū)域大小應該為(bytesPerRow*height)個字節(jié)。如果對繪制操作被渲染的內存區(qū)域并無特別的要求工坊,那么可以傳遞NULL給參數(shù)date献汗。
  • 參數(shù)width代表被渲染內存區(qū)域的寬度。
  • 參數(shù)height代表被渲染內存區(qū)域的高度王污。
  • 參數(shù)bitsPerComponent被渲染內存區(qū)域中組件在屏幕每個像素點上需要使用的bits位罢吃,舉例來說,如果使用32-bit像素和RGB顏色格式昭齐,那么RGBA顏色格式中每個組件在屏幕每個像素點上需要使用的bits位就為32/4=8尿招。
  • 參數(shù)bytesPerRow代表被渲染內存區(qū)域中每行所使用的bytes位數(shù)。
  • 參數(shù)colorspace用于被渲染內存區(qū)域的“位圖上下文”阱驾。
  • 參數(shù)bitmapInfo指定被渲染內存區(qū)域的“視圖”是否包含一個alpha(透視)通道以及每個像素相應的位置就谜,除此之外還可以指定組件式是浮點值還是整數(shù)值。

而傳入?yún)?shù)呢信息又可以從位圖上下文中獲取


CG_EXTERN void * __nullable CGBitmapContextGetData(CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the width of the bitmap context `context', or 0 if `context' is
   not a bitmap context. */

CG_EXTERN size_t CGBitmapContextGetWidth(CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the height of the bitmap context `context', or 0 if `context' is
   not a bitmap context. */

CG_EXTERN size_t CGBitmapContextGetHeight(CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the bits per component of the bitmap context `context', or 0 if
   `context' is not a bitmap context. */

CG_EXTERN size_t CGBitmapContextGetBitsPerComponent(CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the bits per pixel of the bitmap context `context', or 0 if
   `context' is not a bitmap context. */

CG_EXTERN size_t CGBitmapContextGetBitsPerPixel(CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the bytes per row of the bitmap context `context', or 0 if
   `context' is not a bitmap context. */

CG_EXTERN size_t CGBitmapContextGetBytesPerRow(CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the color space of the bitmap context `context', or NULL if
   `context' is not a bitmap context. */

CG_EXTERN CGColorSpaceRef __nullable CGBitmapContextGetColorSpace(
    CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the alpha info of the bitmap context `context', or
   "kCGImageAlphaNone" if `context' is not a bitmap context. */

CG_EXTERN CGImageAlphaInfo CGBitmapContextGetAlphaInfo(
    CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);

/* Return the bitmap info of the bitmap context `context', or 0 if `context'
   is not a bitmap context. */

CG_EXTERN CGBitmapInfo CGBitmapContextGetBitmapInfo(
    CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);

最終根據(jù)位圖上下文創(chuàng)建一個CGImageRef

CG_EXTERN CGImageRef __nullable CGBitmapContextCreateImage(
    CGContextRef cg_nullable context)
    CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
+ (UIImage *)mosaicImage:(UIImage *)image withLevel:(int)level
{
    unsigned char *imgPixel = RequestImagePixelData(image);
    CGImageRef inImageRef = [image CGImage];
    GLuint width = CGImageGetWidth(inImageRef);
    GLuint height = CGImageGetHeight(inImageRef);
    unsigned char prev[4] = {0};
    int bytewidth = width*4;
    int i,j;
    int val = level;
    for(i=0;i<height;i++) {
        if (((i+1)%val) == 0) {
            memcpy(imgPixel+bytewidth*i, imgPixel+bytewidth*(i-1), bytewidth);
            continue;
        }
        for(j=0;j<width;j++) {
            if (((j+1)%val) == 1) {
                memcpy(prev, imgPixel+bytewidth*i+j*4, 4);
                continue;
            }
            memcpy(imgPixel+bytewidth*i+j*4, prev, 4);
        }
    }
    NSInteger dataLength = width*height* 4;
    
    //下面的代碼創(chuàng)建要輸出的圖像的相關參數(shù)
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, imgPixel, dataLength, NULL);
    // prep the ingredients
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
    //創(chuàng)建要輸出的圖像
    CGImageRef imageRef = CGImageCreate(width, height,
                                        bitsPerComponent,
                                        bitsPerPixel,
                                        bytewidth,
                                        colorSpaceRef,
                                        bitmapInfo,
                                        provider,
                                        NULL, NO, renderingIntent);
    UIImage *mosaicImage = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
    CFRelease(imageRef);
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(provider);
    return mosaicImage;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末里覆,一起剝皮案震驚了整個濱河市吁伺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌租谈,老刑警劉巖篮奄,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異割去,居然都是意外死亡窟却,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門呻逆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夸赫,“玉大人,你說我怎么就攤上這事咖城〔缤龋” “怎么了呼奢?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長切平。 經(jīng)常有香客問我握础,道長,這世上最難降的妖魔是什么悴品? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任禀综,我火速辦了婚禮,結果婚禮上苔严,老公的妹妹穿的比我還像新娘定枷。我一直安慰自己,他們只是感情好届氢,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布欠窒。 她就那樣靜靜地躺著,像睡著了一般退子。 火紅的嫁衣襯著肌膚如雪岖妄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天絮供,我揣著相機與錄音衣吠,去河邊找鬼。 笑死壤靶,一個胖子當著我的面吹牛缚俏,可吹牛的內容都是我干的。 我是一名探鬼主播贮乳,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忧换,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了向拆?” 一聲冷哼從身側響起亚茬,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浓恳,沒想到半個月后刹缝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡颈将,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年梢夯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴圾。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡颂砸,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情人乓,我是刑警寧澤勤篮,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站色罚,受9級特大地震影響碰缔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜保屯,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一手负、第九天 我趴在偏房一處隱蔽的房頂上張望涤垫。 院中可真熱鬧姑尺,春花似錦、人聲如沸蝠猬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榆芦。三九已至柄粹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匆绣,已是汗流浹背驻右。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留崎淳,地道東北人堪夭。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像拣凹,于是被迫代替她去往敵國和親森爽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容