基于點(diǎn)陣圖來構(gòu)建 Bezier 路徑

作者:Erica Sadun备闲,原文鏈接挖滤,原文日期:2013-03-15
譯者:星夜暮晨;校對(duì):Crystal Sun浅役;定稿:CMB

我現(xiàn)在正在努力地編寫那本關(guān)于 UIKit / Quartz 的書斩松,書中描述了很多使用 Bezier 路徑繪圖的案例。今天觉既,在進(jìn)行了一天忙碌的寫作之后惧盹,我現(xiàn)在決定好好休息、放松一下瞪讼。

因此我登上了 IRC (Internet Relay Chat)钧椰,在那里我遇到了一個(gè)很有意思的挑戰(zhàn)。它是以 Clarus the dog cow 的形式出現(xiàn)的(譯者注:一只像牛的狗符欠,這個(gè)卡通形象由蘋果傳奇圖形設(shè)計(jì)師 SusanKare 設(shè)計(jì)嫡霞,在早期的 Mac 系統(tǒng)中,用來顯示打印頁面的朝向)希柿。這只狗狗是以點(diǎn)陣圖 (bitmap) 的形式出現(xiàn)的诊沪,通常情況下將其轉(zhuǎn)換為 UIImage 并不是一件很容易的事养筒。當(dāng)然我覺得,應(yīng)該有一種通用的方法能夠?qū)⑵滢D(zhuǎn)換為可重復(fù)使用的路徑端姚。

而今晕粪,受到我對(duì) PaintCode 的評(píng)論的啟示,我決定創(chuàng)建一個(gè)通用的「點(diǎn)陣圖→Bezier 路徑」方法來解決這個(gè)問題渐裸。我最終將會(huì)得到一個(gè)擴(kuò)展類 (Category)巫湘,能夠?qū)⒆止?jié)轉(zhuǎn)換為易于繪制的 UIBezierPath

objective-c
@implementation UIBezierPath (BitmapExtension)
+ (UIBezierPath *) pathFromBitmap: (NSData *) data size: (CGSize) size
{
    Byte *bytes = (Byte *) data.bytes;
    CFIndex height = size.height;
    CFIndex width = size.width;

    if (height * width != data.length)
    {
        NSLog(@"Error: size does not match data's available bytes");
        return nil;
    }

    UIBezierPath *bezierPath = [UIBezierPath bezierPath];
    for (CFIndex y = 0; y < height; y++)
    {
        for (CFIndex x = 0; x < width; x++)
        {
            CFIndex index = y * width + x;
            if (bytes[index] != 0)
            {
                UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(x, y, 1, 1)];
                [bezierPath appendPath:path];
            }
        }
    }

    return bezierPath;
}

譯者注

評(píng)論中有人提問:如何將這個(gè)點(diǎn)陣圖轉(zhuǎn)換為 NSData 對(duì)象呢昏鹃?

Clarus 的點(diǎn)陣圖代碼可以在這里找到:https://gist.github.com/erica/5224282
本文由 SwiftGG 翻譯組翻譯尚氛,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問 http://swift.gg洞渤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阅嘶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子您宪,更是在濱河造成了極大的恐慌奈懒,老刑警劉巖奠涌,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宪巨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溜畅,警方通過查閱死者的電腦和手機(jī)捏卓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慈格,“玉大人怠晴,你說我怎么就攤上這事≡±Γ” “怎么了蒜田?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長选泻。 經(jīng)常有香客問我冲粤,道長,這世上最難降的妖魔是什么页眯? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任梯捕,我火速辦了婚禮,結(jié)果婚禮上窝撵,老公的妹妹穿的比我還像新娘傀顾。我一直安慰自己,他們只是感情好碌奉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布短曾。 她就那樣靜靜地躺著寒砖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪错英。 梳的紋絲不亂的頭發(fā)上入撒,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音椭岩,去河邊找鬼茅逮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛判哥,可吹牛的內(nèi)容都是我干的献雅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼塌计,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挺身!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锌仅,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤章钾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后热芹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贱傀,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伊脓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了府寒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡报腔,死狀恐怖株搔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纯蛾,我是刑警寧澤纤房,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站翻诉,受9級(jí)特大地震影響炮姨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜米丘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一剑令、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拄查,春花似錦吁津、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梭依。三九已至,卻和暖如春典尾,著一層夾襖步出監(jiān)牢的瞬間役拴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工钾埂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留河闰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓褥紫,卻偏偏與公主長得像姜性,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子髓考,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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