iOS圖片的偽裁剪(改變圖片的像素值)

0x00 原理

利用一張圖片事先畫好的圖片(以下稱為蒙板)怠惶,蓋在要被裁剪的的圖片上涨缚,然后遍歷蒙板上的像素點(diǎn),修改被裁剪圖片對(duì)應(yīng)位置的像素的色值即可得到一些我們想要的不規(guī)則圖片了(比如人臉)

0x01 代碼實(shí)現(xiàn)(UIImage分類)

#define Mask8(x) ( (x) & 0xFF )
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8 ) )
#define B(x) ( Mask8(x >> 16) )
#define A(x) ( Mask8(x >> 24) )
#define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )
- (UIImage *)processWithMaskImage:(UIImage *)maskImg {
    if (self == nil) {
        return nil;
    }
    // 1. Get the raw pixels of the image
    UInt32 *inputPixels;
    UInt32 *maskPixels;
    
    CGImageRef maskCGImage = [maskImg CGImage]; //蒙板圖片
    CGImageRef inputCGImage = [self CGImage];//準(zhǔn)備被裁剪的圖片
    NSUInteger inputWidth = CGImageGetWidth(inputCGImage);
    NSUInteger inputHeight = CGImageGetHeight(inputCGImage);
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    NSUInteger bytesPerPixel = 4;
    NSUInteger bitsPerComponent = 8;
    
    NSUInteger inputBytesPerRow = bytesPerPixel * inputWidth;
    
    inputPixels = (UInt32 *)calloc(inputHeight * inputWidth, sizeof(UInt32));
    maskPixels = (UInt32 *)calloc(inputHeight * inputWidth, sizeof(UInt32));
    
    //被裁剪圖片的上下文
    CGContextRef context = CGBitmapContextCreate(inputPixels, inputWidth, inputHeight,
                                                 bitsPerComponent, inputBytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    
    CGContextDrawImage(context, CGRectMake(0, 0, inputWidth, inputHeight), inputCGImage);
    
    //蒙板圖片的上下文
    CGContextRef maskContext = CGBitmapContextCreate(maskPixels, inputWidth, inputHeight,
                                                      bitsPerComponent, inputBytesPerRow, colorSpace,
                                                      kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGContextDrawImage(maskContext, CGRectMake(0, 0, inputWidth, inputHeight), maskCGImage);
    
    // 3. Convert the image
    for (NSUInteger j = 0; j < inputHeight; j++) {
        for (NSUInteger i = 0; i < inputWidth; i++) {
            //獲得源圖片和蒙板圖片每一個(gè)像素值
            UInt32 * currentPixel = inputPixels + (j * inputWidth) + i; 
            UInt32 * currentMaskPixel = maskPixels + (j * inputWidth) + i;
            UInt32 color = *currentMaskPixel;
            NSInteger alpha = A(color); //獲得蒙板上當(dāng)前像素的alpha值
            if (alpha != 0) { //如果不是透明策治,就修改為透明
                //修改被裁剪圖片當(dāng)前像素的值透明
                *currentPixel = RGBAMake(0, 0, 0, 0);
            }
        }//裁剪
    }
    // 4. Create a new UIImage
    CGImageRef newCGImage = CGBitmapContextCreateImage(context);
    UIImage * processedImage = [UIImage imageWithCGImage:newCGImage];
    
    // 5. Cleanup!
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
    CGContextRelease(maskContext);
    free(inputPixels);
    free(maskPixels);
    return processedImage;
}
#undef RGBAMake
#undef R
#undef G
#undef B
#undef A
#undef Mask8

0x10 效果

  1. 蒙板圖片
mengban.png
  1. 裁剪效果
Screen Shot 2016-01-28 at 00.35.19.png

0x11 注意事項(xiàng)和缺點(diǎn)

  1. 使用時(shí)注意要讓裁剪圖的大小與蒙板的圖片大小樣同
  2. 圖片的大小沒有變小仗岖,只是修改了像素的顏色和透明度
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市览妖,隨后出現(xiàn)的幾起案子轧拄,更是在濱河造成了極大的恐慌,老刑警劉巖讽膏,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檩电,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡府树,警方通過查閱死者的電腦和手機(jī)俐末,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奄侠,“玉大人卓箫,你說我怎么就攤上這事÷⒊保” “怎么了烹卒?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弯洗。 經(jīng)常有香客問我旅急,道長(zhǎng),這世上最難降的妖魔是什么牡整? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任藐吮,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谣辞。我一直安慰自己迫摔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布泥从。 她就那樣靜靜地躺著句占,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歉闰。 梳的紋絲不亂的頭發(fā)上辖众,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音和敬,去河邊找鬼凹炸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昼弟,可吹牛的內(nèi)容都是我干的啤它。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舱痘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼变骡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芭逝,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤塌碌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后旬盯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台妆,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年胖翰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了接剩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萨咳,死狀恐怖懊缺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情培他,我是刑警寧澤鹃两,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站靶壮,受9級(jí)特大地震影響怔毛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腾降,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碎绎。 院中可真熱鬧螃壤,春花似錦抗果、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至寄啼,卻和暖如春逮光,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墩划。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工涕刚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乙帮。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓杜漠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親察净。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驾茴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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