iOS_Quartz2D_圖片裁剪

展示效果:


效果圖


效果圖


效果圖


效果圖

請問:實現(xiàn)的步驟是什么?

第一步,需求:需要把一張普通的圖片可以裁剪成圓形顯示,.請問:圖片裁減的思路是什么?

l1>在上下文中繪制一個要裁剪的圖形.

l2>調(diào)用void

CGContextClip(CGContextRef c)進行裁剪.裁剪的意思就是告訴系統(tǒng),將來只有在被裁剪出的區(qū)域內(nèi)繪制的圖形才會顯示.

l3>在裁剪好的上下文中再把圖片繪制上去.直接調(diào)用UIImage對象的繪圖方法即可!注意:繪制圖片的時候,必須繪制到已經(jīng)裁剪出的圖形位置,否則不顯示.

第二步,實現(xiàn)圖片正方形裁剪,以圓形進行顯示,最終生成一張新的圖片.并保存到沙盒中.請問:實現(xiàn)的步驟是什么?

l1>先加載原圖.

l2>創(chuàng)建(開啟)一個和原圖一樣大小的“位圖上下文”

l3>獲取剛才開啟的圖形上下文

l4>執(zhí)行裁剪操作

l4.1>向上下文中繪制一個圓

l4.2>把路徑添加到上下文中

l4.3>執(zhí)行裁剪操作

l5>把圖片繪制到上下文中

l6>從上下文中獲取裁剪好的圖片對象

l6.2>關(guān)閉位圖上下文

l7>將新生成的圖片上下文裁剪成正方形

l7.1>計算出要裁剪的矩形區(qū)域

l7.2>將點轉(zhuǎn)換成像素

l7.3>調(diào)用CGImage對應(yīng)的方法執(zhí)行裁剪

l7.4>釋放CGImage對象

l8>把圖片保存到沙盒中

l8.1>獲取沙盒路徑

l8.2>將UIImage轉(zhuǎn)換為一個NSData對象

l8.3>把圖片二進制數(shù)據(jù)寫入到沙盒文件中

第三步物蝙,再裁剪一個外層帶圓環(huán)的圖片.

l1>先加載原圖.

l2>創(chuàng)建(開啟)一個和原圖一樣大小的“位圖上下文”

l3>獲取剛才開啟的圖形上下文

l4>先繪制一個圓環(huán),然后渲染

l5>將路徑添加到上下文中并進行渲染

l6>再繪制一個要裁剪的圓

l7>從上下文中獲取圖片

l8>關(guān)閉上下文

l9>將上下文裁剪成正方形

l10>調(diào)用CGImage對應(yīng)的方法執(zhí)行裁剪

l10.1>釋放CGImage對象

l11>將圖片保存到沙盒中

//第一步代碼實現(xiàn)

------------------------------ HMDrawingView.m------------------------------

- (void)drawRect:(CGRect)rect {

// 1.加載要裁剪的圖片

UIImage*image = [UIImageimageNamed:@"me"];

// 2.獲取上下文

CGContextRefctx =UIGraphicsGetCurrentContext();

// 3.在上下文中繪制一個要裁剪的圖形

UIBezierPath*pathCircle = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(0,0,100,100)];

CGContextAddPath(ctx, pathCircle.CGPath);

// 4.執(zhí)行裁剪

CGContextClip(ctx);

// 5.把圖片繪制到上下文中

[imagedrawAtPoint:CGPointZero];

}

//第二步代碼實現(xiàn)

------------------------------ ViewController.m------------------------------

//點擊了裁剪圖片按鈕

- (IBAction)didClickButton {

// 1.先加載原圖

UIImage*img = [UIImageimageNamed:@"header"];

// 2.創(chuàng)建(開啟)一個和原圖一樣大小的"位圖上下文"

//參數(shù)1 ->圖形上下文的大小(單位是點)參數(shù)2 ->是否不透明參數(shù)3 ->一個點表示幾個像素

UIGraphicsBeginImageContextWithOptions(img.size,NO,0.0);

// 3.獲取剛才開啟的圖形上下文

CGContextRefctx =UIGraphicsGetCurrentContext();

// 4.執(zhí)行裁剪操作

// 4.1向上下文中繪制一個圓

CGPointcenterP =CGPointMake(img.size.width*0.5, img.size.height*0.5);

CGFloatradius =MIN(img.size.width*0.5, img.size.height*0.5);

UIBezierPath*path = [UIBezierPathbezierPathWithArcCenter:centerPradius:radiusstartAngle:0endAngle:M_PI*2clockwise:YES];

// 4.2把路徑添加到上下文中

CGContextAddPath(ctx, path.CGPath);

// 4.3執(zhí)行裁剪操作

CGContextClip(ctx);

// 5.把圖片繪制到上下文中

[imgdrawAtPoint:CGPointZero];

// 6.從上下文中獲取裁剪好的圖片對象

UIImage*imgCliped =UIGraphicsGetImageFromCurrentImageContext();

// 6.2關(guān)閉位圖上下文

UIGraphicsEndImageContext();

// 7.將新生成的圖片上下文裁剪成正方形

// 7.1計算出要裁剪的矩形區(qū)域

CGFloatclipX = (img.size.width- (radius *2)) *0.5;

CGFloatclipY = (img.size.height- (radius *2)) *0.5;

CGFloatclipW = radius *2;

CGFloatclipH = clipW;

// 7.2將點轉(zhuǎn)換成像素

CGFloatscale = [UIScreenmainScreen].scale;

clipX = clipX *scale;

clipY *= scale;

clipW *= scale;

clipH *= scale;

CGRectclipedRect =CGRectMake(clipX, clipY, clipW,clipH);

// 7.3調(diào)用CGImage對應(yīng)的方法執(zhí)行裁剪

CGImageRefcgImageCliped =CGImageCreateWithImageInRect(imgCliped.CGImage, clipedRect);

//把CGImage轉(zhuǎn)換成UIImage對象

imgCliped = [UIImageimageWithCGImage:cgImageCliped];

// 7.4釋放CGImage對象

CGImageRelease(cgImageCliped);

// 8.把圖片保存到沙盒中

// 8.1獲取沙盒路徑

NSString*fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingPathComponent:@"cliped.png"];

// 8.2把UIImage轉(zhuǎn)換為一個NSData對象

NSData*imgData =UIImagePNGRepresentation(imgCliped);

// 8.3把圖片二進制數(shù)據(jù)寫入到沙盒文件中

[imgDatawriteToFile:fileNameatomically:YES];

NSLog(@"%@", fileName);

}

//第三步代碼實現(xiàn)

------------------------------ ViewController.m------------------------------

//裁剪一個帶圓環(huán)的圖片

- (IBAction)didClickButton {

// 1.加載原圖

UIImage*img = [UIImageimageNamed:@"dst2"];

// 2.創(chuàng)建一個和原圖一樣大小的位圖上下文

UIGraphicsBeginImageContextWithOptions(img.size,NO,0.0);

// 3.獲取上下文

CGContextRefctx =UIGraphicsGetCurrentContext();

// 4.先繪制一個圓環(huán),然后渲染

//線寬

CGFloatlineWidth =10;

CGPointcenterP =CGPointMake(img.size.width*0.5, img.size.height*0.5);

CGFloatradius =MIN(img.size.width*0.5, img.size.height*0.5) - lineWidth *0.5;

UIBezierPath*path = [UIBezierPathbezierPathWithArcCenter:centerPradius:radiusstartAngle:0endAngle:M_PI*2clockwise:YES];

CGContextSetLineWidth(ctx, lineWidth);

[[UIColorredColor]set];

// 5.將路徑添加到上下文中并進行渲染

CGContextAddPath(ctx, path.CGPath);

CGContextDrawPath(ctx,kCGPathStroke);

// 6.再繪制一個要裁剪的圓

// 6.1創(chuàng)建一個圓路徑

UIBezierPath*pathCircleClip = [UIBezierPathbezierPathWithArcCenter:centerPradius:radiusstartAngle:0endAngle:M_PI*2clockwise:YES];

// 6.2把路徑添加到上下文中

CGContextAddPath(ctx, pathCircleClip.CGPath);

// 6.3執(zhí)行裁剪

CGContextClip(ctx);

// 6.4把圖片繪制到上下文中

[imgdrawAtPoint:CGPointZero];

// 7.從上下文中獲取圖片

UIImage*imageCliped =UIGraphicsGetImageFromCurrentImageContext();

// 8.關(guān)閉上下文

UIGraphicsEndImageContext();

// 9.將上下文裁剪成正方形

CGFloatclipX = (img.size.width- ((radius +

(lineWidth *0.5)) *2)) *0.5;

CGFloatclipY = (img.size.height- ((radius +

(lineWidth *0.5)) *2)) *0.5;

CGFloatclipW = (radius +

(lineWidth *0.5)) *2;

CGFloatclipH = clipW;

// 9.2把點轉(zhuǎn)換成像素

CGFloatscale = [UIScreenmainScreen].scale;

clipX *= scale;

clipY *= scale;

clipW *= scale;

clipH *= scale;

CGRectclipedRect =CGRectMake(clipX, clipY, clipW,clipH);

// 10.調(diào)用CGImage對應(yīng)的方法執(zhí)行裁剪

CGImageRefcgImageCliped =CGImageCreateWithImageInRect(imageCliped.CGImage, clipedRect);

imageCliped = [UIImageimageWithCGImage:cgImageCliped];

// 10.1釋放CGImage對象

CGImageRelease(cgImageCliped);

// 11.將圖片保存到沙盒中

// 11.1獲取沙盒路徑

NSString*fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingPathComponent:@"loop_cliped03.png"];

// 11.2把UIImage轉(zhuǎn)換為一個NSData對象

NSData*imageData =UIImagePNGRepresentation(imageCliped);

// 11.3將圖片二進制數(shù)據(jù)寫入到文件中

[imageDatawriteToFile:fileNameatomically:YES];

NSLog(@"%@",fileName);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赐劣,一起剝皮案震驚了整個濱河市萝究,隨后出現(xiàn)的幾起案子蜈抓,更是在濱河造成了極大的恐慌婴栽,老刑警劉巖拇厢,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱谁,死亡現(xiàn)場離奇詭異,居然都是意外死亡孝偎,警方通過查閱死者的電腦和手機访敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衣盾,“玉大人寺旺,你說我怎么就攤上這事爷抓。” “怎么了阻塑?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵蓝撇,是天一觀的道長。 經(jīng)常有香客問我叮姑,道長唉地,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任传透,我火速辦了婚禮耘沼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朱盐。我一直安慰自己群嗤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布兵琳。 她就那樣靜靜地躺著狂秘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躯肌。 梳的紋絲不亂的頭發(fā)上者春,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音清女,去河邊找鬼钱烟。 笑死,一個胖子當(dāng)著我的面吹牛嫡丙,可吹牛的內(nèi)容都是我干的拴袭。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼曙博,長吁一口氣:“原來是場噩夢啊……” “哼拥刻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起父泳,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤般哼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惠窄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝她,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年睬捶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近刘。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡擒贸,死狀恐怖臀晃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情介劫,我是刑警寧澤徽惋,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站座韵,受9級特大地震影響险绘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜誉碴,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一宦棺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黔帕,春花似錦代咸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奋岁,卻和暖如春思瘟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闻伶。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工滨攻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虾攻。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓铡买,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霎箍。 傳聞我的和親對象是個殘疾皇子奇钞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

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

  • 原文地址:http://www.cocoachina.com/industry/20140115/7703.htm...
    默默_David閱讀 6,111評論 0 1
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜漂坏,今天將帶大家一窺ios動畫全貌景埃。在這里你可以看...
    每天刷兩次牙閱讀 8,515評論 6 30
  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作為繪圖引擎顶别。它提供了低...
    ShanJiJi閱讀 1,542評論 0 20
  • 人生由四個維度組成:高度(價值觀:影響力與權(quán)力)谷徙、深度(價值觀:卓越、智慧)驯绎、寬度(價值觀:愛與和諧)完慧、溫度(價值...
    f7cedba0d0a6閱讀 992評論 1 50
  • 2017.4.15.下午決定帶著你去攀牙灣!從普吉島的阿曼酒店乘車20分鐘就到了去攀牙灣的碼頭在車上你就睡著了剩失!奶...
    姜每文閱讀 145評論 0 0