iOS如何簡單進(jìn)行位圖圖像處理


首先什么是位圖其掂?
****位圖圖像(bitmap), 亦稱為點(diǎn)陣圖像或繪制圖像,是由稱作像素(圖片元素)的單個點(diǎn)組成的(百度百科)。****


由于在iOS開發(fā)中使用的位圖大部分是32位RGBA模式碍彭,所以我們之說下這種模式的簡單圖像處理。
首先我們需要知道什么是32位RGBA模式的位圖悼潭。32位就表示一個這種模式位圖的一個像素所占內(nèi)存為32位庇忌,也就是4個字節(jié)的長度。R舰褪、G皆疹、B、A分別代表red占拍,green略就,blue和alpha捎迫,也就是顏色組成的三原色與透明度值。RGBA每一個占用一個字節(jié)的內(nèi)存表牢。
知道了上面這些窄绒,我們就有了思路:通過改變每一個像素中的RGBA值來進(jìn)行一些位圖圖像的處理了。


首先我們試著把下面這張圖轉(zhuǎn)化為一張紅色的圖崔兴。

原圖

我們首先了解一下CGImageRef的結(jié)構(gòu)

 CGImageRef CGImageCreate (
 
 size_t width, //圖片的寬度
 
 size_t height, //圖片的高度
 
 size_t bitsPerComponent, //圖片每個顏色的bits
 
 size_t bitsPerPixel, //每一個像素占用的bits彰导,156位24位 32位等等
 
 size_t bytesPerRow, //每一行占用多少bytes 注意是bytes不是bits  1byte = 8bit
 
 CGColorSpaceRef colorspace, //顏色空間,比如rgb
 
 CGBitmapInfo bitmapInfo, //layout 敲茄,像素中bit的布局位谋, 是rgba還是 argb
 
 CGDataProviderRef provider, //數(shù)據(jù)源提供者,url或者內(nèi)存...
 
 const CGFloat decode[], //一個解碼數(shù)組
 
 bool shouldInterpolate, //抗鋸齒參數(shù)
 
 CGColorRenderingIntent intent //圖片渲染相關(guān)參數(shù)
 
 }

了解了image的效果我們就可以擼代碼了

- (void)HandleImage:(UIImage *)img complite:(void(^)(UIImage *img))complite
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    CGImageRef imgref = img.CGImage;
    size_t width = CGImageGetWidth(imgref);
    size_t height = CGImageGetHeight(imgref);
    size_t bitsPerComponent = CGImageGetBitsPerComponent(imgref);
    size_t bitsPerPixel = CGImageGetBitsPerPixel(imgref);
    size_t bytesPerRow = CGImageGetBytesPerRow(imgref);
    
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(imgref);
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imgref);
    
    bool shouldInterpolate = CGImageGetShouldInterpolate(imgref);
    
    CGColorRenderingIntent intent = CGImageGetRenderingIntent(imgref);
    
    CGDataProviderRef dataProvider = CGImageGetDataProvider(imgref);
    
    CFDataRef data = CGDataProviderCopyData(dataProvider);
    
    UInt8 *buffer = (UInt8*)CFDataGetBytePtr(data);//Returns a read-only pointer to the bytes of a CFData object.// 首地址
    NSUInteger  x, y;
    // 像素矩陣遍歷折汞,改變成自己需要的值
    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            UInt8 *tmp;
            tmp = buffer + y * bytesPerRow + x * 4;
            UInt8 alpha;
            alpha = *(tmp + 3);
            if (alpha) {// 透明不處理 其他變成紅色
                *tmp = 255;//red
                *(tmp + 1) = 0;//green
                *(tmp + 2) = 0;// Blue
            }
        }
    }
    
    CFDataRef effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));
    
    CGDataProviderRef effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);
    // 生成一張新的位圖
    CGImageRef effectedCgImage = CGImageCreate(
                                               width, height,
                                               bitsPerComponent, bitsPerPixel, bytesPerRow,
                                               colorSpace, bitmapInfo, effectedDataProvider,
                                               NULL, shouldInterpolate, intent);
    
    UIImage *effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage];
    
    CGImageRelease(effectedCgImage);
    
    CFRelease(effectedDataProvider);
    
    CFRelease(effectedData);
    
    CFRelease(data);
    dispatch_async(dispatch_get_main_queue(), ^{
        if (complite) {
            complite(effectedImage);
        }
    });
});
}

這樣我們就得到了一張紅色的圖像

紅色圖像

當(dāng)然我們還可以改變很多
我們把這段代碼

            UInt8 *tmp;
            tmp = buffer + y * bytesPerRow + x * 4;
            UInt8 alpha;
            alpha = *(tmp + 3);
            if (alpha) {// 透明不處理 其他變成紅色
                *tmp = 255;//red
                *(tmp + 1) = 0;//green
                *(tmp + 2) = 0;// Blue
            }

換成

            UInt8 *tmp;
            tmp = buffer + y * bytesPerRow + x * 4;
            UInt8 alpha;
            alpha = *(tmp + 3);
            UInt8 temp = *tmp;// 取red值
            if (alpha) {// 透明不處理 其他變成紅色
                // 將green和blue都改成red的值倔幼,獲取灰色圖
                *(tmp + 1) = temp;
                *(tmp + 2) = temp;
            }
灰色圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爽待,隨后出現(xiàn)的幾起案子损同,更是在濱河造成了極大的恐慌,老刑警劉巖鸟款,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膏燃,死亡現(xiàn)場離奇詭異,居然都是意外死亡何什,警方通過查閱死者的電腦和手機(jī)组哩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來处渣,“玉大人伶贰,你說我怎么就攤上這事」拚唬” “怎么了黍衙?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荠诬。 經(jīng)常有香客問我琅翻,道長,這世上最難降的妖魔是什么柑贞? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任方椎,我火速辦了婚禮,結(jié)果婚禮上钧嘶,老公的妹妹穿的比我還像新娘棠众。我一直安慰自己,他們只是感情好有决,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布摄欲。 她就那樣靜靜地躺著轿亮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胸墙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天按咒,我揣著相機(jī)與錄音迟隅,去河邊找鬼。 笑死励七,一個胖子當(dāng)著我的面吹牛智袭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掠抬,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼吼野,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了两波?” 一聲冷哼從身側(cè)響起瞳步,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腰奋,沒想到半個月后单起,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劣坊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年嘀倒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局冰。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡测蘑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出康二,到底是詐尸還是另有隱情碳胳,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布赠摇,位于F島的核電站固逗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏藕帜。R本人自食惡果不足惜烫罩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洽故。 院中可真熱鬧贝攒,春花似錦、人聲如沸时甚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梨熙,卻和暖如春开镣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咽扇。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工邪财, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人质欲。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓树埠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘶伟。 傳聞我的和親對象是個殘疾皇子怎憋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容