iOS 圖片截取

  • 業(yè)務(wù)邏輯:為需要切圖的view添加pan手勢,定義一個(gè)需要截取范圍視圖的成員屬性,定義一個(gè)成員變量用來記錄手指的開始點(diǎn),在pan方法中,根據(jù)手勢的狀態(tài),獲取矩形框的開始起點(diǎn)和結(jié)束點(diǎn),然后根據(jù)起點(diǎn)和終點(diǎn),獲取截取范圍,然后開啟位圖上下文,設(shè)置裁剪區(qū)域,把內(nèi)容渲染到上下文,獲取新的圖片,結(jié)束上下文,最后刪除截取范圍視圖,并值為nil,移除手勢
@interface ViewController ()
// 開始起點(diǎn)屬性
@property (nonatomic, assign) CGPoint startP;
// 截取范圍視圖
@property (nonatomic, weak) UIView *clipView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (UIView *)clipView
{
    if (!_clipView) {
        UIView *clipView = [[UIView alloc] init];
        clipView.backgroundColor = [UIColor blackColor];
        clipView.alpha = 0.5;
        _clipView = clipView;
        [self.view addSubview:_clipView];
    }
    
    return _clipView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self addGesture];
}
- (void)addGesture
{
    // 添加pan手勢
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [self.view addGestureRecognizer:pan];
}
#pragma mark - pan手勢
- (void)pan:(UIPanGestureRecognizer *)pan
{
    CGPoint endP = CGPointZero;
    // 獲取矩形框的開始起點(diǎn)
    if (pan.state == UIGestureRecognizerStateBegan) {
        // 獲取一開始觸摸點(diǎn)
        self.startP = [pan locationInView:self.view];
    }else if (pan.state == UIGestureRecognizerStateChanged)
    {
        // 獲得結(jié)束那一時(shí)刻的點(diǎn)
        endP = [pan locationInView:self.view];
        // 根據(jù)起點(diǎn)和終點(diǎn),獲取截取范圍
        CGFloat w = endP.x - self.startP.x;
        CGFloat h = endP.y - self.startP.y;
        
        CGRect clipRect = CGRectMake(self.startP.x, self.startP.y, w, h);
        
        self.clipView.frame = clipRect;
        
    }else if (pan.state == UIGestureRecognizerStateEnded)
    {
        // 開啟上下文
        UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, NO, 0);
        
        // 設(shè)置裁剪區(qū)域
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.clipView.frame];
        [path addClip];
        
        // 把內(nèi)容渲染到上下文
        [self.imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
        
        // 獲取新的圖片
        self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
        
        // 結(jié)束上下文
        UIGraphicsEndImageContext();
        
        // 刪除clipView視圖
        [self.clipView removeFromSuperview];
        self.clipView = nil;
        
        [self.view removeGestureRecognizer:pan];
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 翻譯自“View Controller Programming Guide for iOS”。 1 彈出視圖控制器...
    lakerszhy閱讀 3,776評論 2 20
  • 1.圓形圖片裁剪 目標(biāo)明確: 得到一張圖片 (=> 位圖上下文,手動(dòng)開啟和關(guān)閉,代碼位置任意)思路:先設(shè)置好位圖上...
    夏天不冷閱讀 901評論 0 1
  • Quartz2D 簡介 Quartz2D是二維(平面)的繪圖引擎(經(jīng)包裝的函數(shù)庫,方便開發(fā)者使用。也就是說蘋果幫我...
    iOS_Cqlee閱讀 671評論 0 2
  • 如果心情不好,就放肆的嘶吼吧,不過最好不要讓人聽到;如果心情不好,就假裝開開心心的吧,至少你的笑容可以感染別人;如...
    今天不愛伊萬閱讀 226評論 0 0
  • 兩種方式:java虛擬機(jī)和旁邊另一個(gè)按鈕另一個(gè)按鈕。 (關(guān)掉虛擬機(jī)正在執(zhí)行的debuge) 右叉叉 resume:...
    Dafanzi閱讀 327評論 0 0

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