圓形圖片裁剪

一直覺得簡(jiǎn)書是個(gè)充滿文學(xué)氛圍濃厚的平臺(tái),后來(lái)一些同事和圈友經(jīng)常問(wèn)一些技術(shù)方面的問(wèn)題,說(shuō)我要是把我那本經(jīng)常用來(lái)記錄開發(fā)中遇到問(wèn)題的解決問(wèn)題的隨機(jī)本給分享到簡(jiǎn)書上,我們就不用經(jīng)常麻煩你了,也可以幫到很多iOS初學(xué)者,想想有道理,后來(lái)又因?yàn)闀r(shí)間和文筆匱乏的關(guān)系,一直沒有著手這個(gè)事,種種原因下了個(gè)決定,以后每個(gè)禮拜會(huì)抽出部分時(shí)間,把一些開發(fā)中遇到解決了的問(wèn)題,在這里分享一下。

下面是最近親測(cè)的一個(gè)關(guān)于cell中經(jīng)常要裁剪用戶頭像為圓形頭像的一些方法,之前包括查網(wǎng)上資料,一直說(shuō)用貝塞爾路徑畫出來(lái)的圓形圖片比 直接設(shè)置圓角半徑性能更高,但是親測(cè)發(fā)現(xiàn),從iOS9后,蘋果對(duì)圓角半徑這個(gè)做了性能優(yōu)化,用它完全不會(huì)影響你的幀數(shù),甚至性能比畫的更好,廢話不多說(shuō)直接上代碼:

裁剪圓形圖片的方法:

①畫圖,開啟上下文,獲得新的圓形圖片

兩種上下文:layer只能在view上面和圖形上下文
opaque:不透明度 YES:會(huì)讓裁剪掉的部分為黑色; No:讓裁剪掉的部分為透明,
scale:比例因子,為2則??2倍,像素與點(diǎn)比例 為0: 自動(dòng)識(shí)別 [UIScreen mainScreen].scale
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0) ;
將裁剪圓形圖片給UIImage封裝一個(gè)分類:

//  borderW是圓形圖片邊框的寬度,borderColor是邊框顏色,image需要裁剪為圓形的圖片

+ (UIImage *)imageWithBorderW:(CGFloat)borderW borderColor:(UIColor *)color image:(UIImage *)image{
    if (!image) return nil;
    
    //1.生成一張圖片,開啟一個(gè)位圖上下文(大小,圖片的寬高 + 2 * 邊框?qū)挾?
    CGSize size = CGSizeMake(image.size.width + 2 *borderW, image.size.height + 2 *borderW);
    UIGraphicsBeginImageContext(size);
    
    //2.繪制一個(gè)大圓
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, size.width, size.height)];
    [color set];
    [path fill];
    
    //3.設(shè)置裁剪區(qū)域
    UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(borderW, borderW, image.size.width, image.size.height)];
    //3.1 把路徑設(shè)置為裁剪區(qū)域
    [clipPath addClip];
    
    //4 把圖片繪制到上下文
    [image drawAtPoint:CGPointMake(borderW, borderW)];
    
    //5.從上下文當(dāng)中獲取圖片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    //6.關(guān)閉上下文
    UIGraphicsEndImageContext();
    
    return newImage;
    
    
}

②設(shè)置圓角半徑

-(void)layoutSubviews{
    [super layoutSubviews] ;
    _iconImageView.layer.cornerRadius = _iconImageView.JG_width * 0.5 ;
    //超出主層就會(huì)剪切掉
    _iconImageView.layer.masksToBounds = YES ;
}

注:這個(gè)要在layoutSubviews里面用,才能設(shè)置寬度;
之前設(shè)置圓角是會(huì)降低幀數(shù),但是親測(cè) iOS9開始cornerRadius不會(huì)對(duì)幀數(shù)有影響,

③runtime直接在xib中添加屬性,不是很推薦使用(因?yàn)椴辉诖a中顯示,不直觀,不利于程序員之間交流)

06807088-7780-4A82-AB52-EAD2F90C8656.png

注:幾個(gè)項(xiàng)目中親測(cè)發(fā)現(xiàn),用runtime或layer層剪切圓形圖片內(nèi)存占用小,位圖上下文占用最大

更多好用封裝好的分類敬請(qǐng)期待……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 具體實(shí)現(xiàn)思路: 1.假設(shè)邊框?qū)挾葹锽orderW 2.開啟的圖片上下文的尺寸就應(yīng)該是原始圖片的寬高分別加上兩倍的B...
    onlychenj閱讀 2,520評(píng)論 0 4
  • 使用圖層剪切 通過(guò)Quartz2D將圖形繪制出一張圓形圖片 通常的解決的辦法就是通過(guò)Quartz2D將圖形繪制出一...
    huanghy閱讀 3,561評(píng)論 2 6
  • R(P48) 藍(lán)本是創(chuàng)造價(jià)值的最初嘗試,不是最終產(chǎn)品。初次嘗試也許會(huì)很難看、很粗糙,沒關(guān)系!藍(lán)本之所以重要是因?yàn)樗?..
    鷹隼閱讀 417評(píng)論 0 1
  • 離離原上草9 正值飯點(diǎn),火鍋店里的人已經(jīng)快要坐滿,他們來(lái)到訂好的位置,顧心穎接過(guò)菜單點(diǎn)了一盤自己愛吃的將菜單遞給喬...
    何奈可閱讀 591評(píng)論 0 2
  • 背景:兒子近段時(shí)間老是容易說(shuō)“個(gè)吧”,我們認(rèn)為是他再罵人,可是經(jīng)我做了自我覺醒的功課后,發(fā)覺不能把這個(gè)問(wèn)題當(dāng)問(wèn)題,...
    懶小嬋閱讀 499評(píng)論 0 0

友情鏈接更多精彩內(nèi)容