本文實例介紹了ios手動剪裁圖片并保存到相冊的詳細代碼,分享給大家供大家參考,具體內容如下
一、實現效果
1、操作步驟
- 繪制一個矩形框,彈出一個alertview,提示是否保存圖片
- 點擊"是",將圖片保存到相冊
- 在相冊中查看保存的圖片
2、效果圖
二、實現思路
1、在控制器的view上添加一個imageview,設置圖片
2、在控制器的view上添加一個pan手勢
3、跟蹤pan手勢,繪制一個矩形框(圖片的剪切區域)
4、在pan手勢結束時,通過alertview提示“是否將圖片保存至相冊?”
- 點擊“是”,保存圖片
- 點擊“否”,暫時什么都不做
三、實現步驟
1、通過storyboard在控制器的view上添加一個imageview(設置圖片),并在控制器的.m文件中擁有該屬性
1
|
@property (weak, nonatomic) iboutlet uiimageview *imageview; |
2、設置通過手勢繪制的圖片的剪切區域
將圖片的剪切區域作為成員屬性clipview
1
|
@property (nonatomic, weak) uiview *clipview; |
3、通過懶加載的方式創建clipview,并初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
- (uiview *)clipview { //如果clipview為被創建,就創建 if (_clipview == nil) { uiview *view = [[uiview alloc] init]; _clipview = view; //設置clipview的背景色和透明度 view.backgroundcolor = [uicolor blackcolor]; view.alpha = 0.5; //將clipview添加到控制器的view上,此時的clipview不會顯示(未設置其frame) [self.view addsubview:_clipview]; } return _clipview; } |
4、給控制器的view添加pan手勢,跟蹤pan手勢,繪制圖片剪切區域
1)、創建并添加手勢
1
2
3
4
5
6
7
|
/**創建手勢**/ uipangesturerecognizer *pan = [[uipangesturerecognizer alloc] initwithtarget:self action:@selector(pan:)]; /** *每當pan手勢的位置發生變化,就會調用pan:方法,并將手勢作為參數傳遞 */ /**添加手勢**/ [self.view addgesturerecognizer:pan]; |
2)、增加成員屬性,記錄pan手勢開始的點
1
|
@property (nonatomic, assign) cgpoint startpoint; |
3)、監聽手勢的移動
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
- ( void )pan:(uipangesturerecognizer *)pan { cgpoint endpoint = cgpointzero; if (pan.state == uigesturerecognizerstatebegan) { /**開始點擊時,記錄手勢的起點**/ self.startpoint = [pan locationinview:self.view]; } else if (pan.state == uigesturerecognizerstatechanged) { /**當手勢移動時,動態改變終點的值,并計算起點與終點之間的矩形區域**/ endpoint = [pan locationinview:self.view]; //計算矩形區域的寬高 cgfloat w = endpoint.x - self.startpoint.x; cgfloat h = endpoint.y - self.startpoint.y; //計算矩形區域的frame cgrect cliprect = cgrectmake(self.startpoint.x, self.startpoint.y, w, h); //設置剪切區域的frame self.clipview.frame = cliprect; } else if (pan.state == uigesturerecognizerstateended) { /**若手勢停止,將剪切區域的圖片內容繪制到圖形上下文中**/ //開啟位圖上下文 uigraphicsbeginimagecontextwithoptions(self.imageview.bounds.size, no, 0); //創建大小等于剪切區域大小的封閉路徑 uibezierpath *path = [uibezierpath bezierpathwithrect:self.clipview.frame]; //設置超出的內容不顯示, [path addclip]; //獲取繪圖上下文 cgcontextref context = uigraphicsgetcurrentcontext(); //將圖片渲染的上下文中 [self.imageview.layer renderincontext:context]; //獲取上下文中的圖片 uiimage *image = uigraphicsgetimagefromcurrentimagecontext(); //關閉位圖上下文 uigraphicsendimagecontext(); //移除剪切區域視圖控件,并清空 [self.clipview removefromsuperview]; self.clipview = nil; //將圖片顯示到imageview上 self.imageview.image = image; //通過alertview提示用戶,是否將圖片保存至相冊 uialertview *alertview = [[uialertview alloc] initwithtitle:@ "保存圖片" message:@ "是否將圖片保存至相冊?" delegate:self cancelbuttontitle:@ "否" otherbuttontitles:@ "是" , nil]; [alertview show]; } } |
4)、設置alertview的代理方法,確定是否保存圖片
1
2
3
4
5
6
7
8
9
10
11
|
- ( void )alertview:(nonnull uialertview *)alertview clickedbuttonatindex:(nsinteger)buttonindex { //若點擊了“是”,則保存圖片 if (buttonindex == 1) { uiimagewritetosavedphotosalbum(self.imageview.image, nil, nil, nil); /** * 該方法可以設置保存完畢調用的方法,此處未進行設置 */ } } |
以上就是本文的全部內容,希望對大家的學習有所幫助。