Swift - 直接改內(nèi)存實(shí)現(xiàn)圖片圓角

參考自文章:http://www.reibang.com/p/bbb50b2cb7e6
以下是關(guān)鍵方法的Swift寫法奏窑。

func dealImage(_ img: UIImage, cornerRadius c: CGFloat) -> UIImage? {
    
    guard
        let sourceData = img.cgImage?.dataProvider?.data,
        let mutableSourceData = CFDataCreateMutableCopy(kCFAllocatorDefault, CFDataGetLength(sourceData), sourceData),
        let mutablePointer = CFDataGetMutableBytePtr(mutableSourceData)
    else { return nil }
    
    let width = Int(img.size.width * img.scale)
    let height = Int(img.size.height * img.scale)

    cornerImage(at: mutablePointer, w: width, h: height, cornerRadius: c)
    
    guard let pv = CGDataProvider(dataInfo: nil,
                                  data: UnsafeRawPointer(mutablePointer),
                                  size: width * height * 4,
                                  releaseData: { (info, data, size) in
                                    free(UnsafeMutableRawPointer(mutating: data))
    }) else { return nil }
    
    let alphaPremultipliedLast = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
    
    guard let content = CGImage(
        width: width,
        height: height,
        bitsPerComponent: 8,
        bitsPerPixel: 32,
        bytesPerRow: 4 * width,
        space: CGColorSpaceCreateDeviceRGB(),
        bitmapInfo: [.byteOrder32Big, alphaPremultipliedLast],
        provider: pv,
        decode: nil,
        shouldInterpolate: true,
        intent: .defaultIntent) else { return nil }
    let result = UIImage(cgImage: content)
    return result
}

func cornerImage(at pointer: UnsafeMutablePointer<UInt8>, w: Int, h: Int, cornerRadius: CGFloat) {
    let min = CGFloat(w > h ? h : w)
    let c: Int = {
        var c = cornerRadius
        if c < 0 { c = 0 }
        if c > min * 0.5 { c = 0.5 }
        return Int(c)
    }()
    
    let pixelPointer = unsafeBitCast(pointer, to: UnsafeMutablePointer<UInt32>.self)
    
    // 左上 y:[0, c), x:[0, c-y)
    for y in 0 ..< c {
        for x in 0 ..< c - y {
            if outsideCircle(cx: c, cy: c, r: c, px: x, py: y) {
                pixelPointer[y * w + x] = 0
            }
        }
    }
    
    // 右上
    for y in 0 ..< c {
        for x in w - c - y ..< w {
            if outsideCircle(cx: w - c, cy: c, r: c, px: x, py: y) {
                pixelPointer[y * w + x] = 0
            }
        }
    }
    
    // 左下
    for y in h - c ..< h {
        for x in 0 ..< y - (h - c) {
            if outsideCircle(cx: c, cy: h - c, r: c, px: x, py: y) {
                pixelPointer[y * w + x] = 0
            }
        }
    }
    
    // 右下
    for y in h - c ..< h {
        for x in w - c + (h - y) ..< w {
            if outsideCircle(cx: w - c, cy: h - c, r: c, px: x, py: y) {
                pixelPointer[y * w + x] = 0
            }
        }
    }
}

func outsideCircle(cx: Int, cy: Int, r: Int, px: Int, py: Int) -> Bool {
    return (cx - px) * (cx - px) + (cy - py) * (cy - py) > r * r
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹰晨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌模蜡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忍疾,死亡現(xiàn)場離奇詭異,居然都是意外死亡卤妒,警方通過查閱死者的電腦和手機(jī)字币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門共缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骄呼,你說我怎么就攤上這事判没◎烟眩” “怎么了澄峰?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俏竞。 經(jīng)常有香客問我,道長魂毁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任咬崔,我火速辦了婚禮,結(jié)果婚禮上垮斯,老公的妹妹穿的比我還像新娘。我一直安慰自己兜蠕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布熊杨。 她就那樣靜靜地躺著盗舰,像睡著了一般晶府。 火紅的嫁衣襯著肌膚如雪岭皂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天爷绘,我揣著相機(jī)與錄音进倍,去河邊找鬼购对。 笑死猾昆,一個胖子當(dāng)著我的面吹牛骡苞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播解幽,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躲株!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霜定,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎望浩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磨德,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年切诀,在試婚紗的時候發(fā)現(xiàn)自己被綠了搔弄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幅虑。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡顾犹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炫刷,到底是詐尸還是另有隱情,我是刑警寧澤浑玛,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響胃碾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仆百,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一奔脐、第九天 我趴在偏房一處隱蔽的房頂上張望俄周。 院中可真熱鬧髓迎,春花似錦峦朗、人聲如沸竖般。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闭翩。三九已至挣郭,卻和暖如春疗韵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蕉汪。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留者疤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓驹马,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糯累。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫效拭、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,098評論 4 62
  • 只是跟他呆在一起的時候很開心缎患,很自在,也不會計較什么较锡。 只是我有男朋友,他有喜歡的人蚂蕴。 他覺得我很傻低散,我也認(rèn)為他二...
    王曉曉DE小屋閱讀 167評論 0 0
  • 10點(diǎn)起床骡楼,打開郵箱發(fā)現(xiàn)鏟子騎士打折了,立即購買鸟整。玩了一小時繼續(xù)看python的函數(shù)式編程。 1點(diǎn)和臟好人去吃午飯...
    AJI米閱讀 169評論 0 0
  • 一篮条,.為自己開設(shè)的店鋪里的某款具體產(chǎn)品,按照花卷app產(chǎn)品推介6模塊進(jìn)行描述(建議下載app或登錄職教云app查看...
    68b183b38b2b閱讀 359評論 0 0