美文网首页
图片处理-缩放旋转裁剪

图片处理-缩放旋转裁剪

作者: 大王_小王 | 来源:发表于2016-02-16 17:22 被阅读400次

    嗦嘶话,第一次见到这个需求的时候,感觉很简单。不就是缩放,然后裁剪吗,加个旋转和快速恢复。

    但似。做的时候,可就不这么想了。

    因为:我要做的需要有弹簧效果,这就需要scroll做容器了。然而,调试缩放完后去切图,可就找不到原点了。裁剪出来的乱七八糟的。

    找了很多github上的缩放的案例,没有一个合适的。只好自己造轮子了。

    造出来之后,挺简单,这玩意儿就跟0->1似的,逻辑不跑通,你永远隔河远望,等你过了河,就觉得其实没啥。不废话,说思路:

    缩放+裁剪+旋转+快速缩放-->见大家APP晒呗首页右上角按钮点击。

    思路:

    一:最下层是一个view,做总容器--我称之为绘图层

       {// 绘图方法
      #pragma mark - 绘制画布上的图
    
    -(UIImage *)getScreenSnapshot{
    
    CGSize imgSize = CGSizeMake(kSCREEN_WIDTH,kSCREEN_WIDTH);
    
    UIGraphicsBeginImageContextWithOptions(imgSize, NO, [UIScreen mainScreen].scale);
    
    //    UIGraphicsBeginImageContext(imgSize);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    [self.contextRefView.layer renderInContext:context];
    
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return img;
    
    }
    #pragma mark -剪切某图片某区域的图片
    
    - (UIImage *)image:(UIImage *)image cropInRect:(CGRect)rect
    
    {// 这个没用到
    
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    
    UIImage *cropped = [UIImage imageWithCGImage:imageRef];
    
    CGImageRelease(imageRef);
    
    return cropped;
    }
    }
    

    二:倒数第二层,旋转层,还是一个uiview,用来旋转

    旋转方法:

    -(void)rotationImage:(UIButton *)sender{
    
    NSInteger swich = self.direction%4;// 记得初始化
    
    [UIView animateWithDuration:0.3 animations:^{
    
    self.contentView.transform = CGAffineTransformMakeRotation(-90*swich *M_PI / 180.0);// 度数和速度自调
    
    }];
    
    self.direction++;//控制方向变化
    
    }
    

    三:再上一层,缩放层,放scrollview,手势缩放和快速缩放使用

    #pragma mark - UIScrollViewDelegate
    
    - (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    
    return self.showImage;
    
    }
    - (void)scrollViewDidZoom:(UIScrollView *)scrollView
    
    {
    
    CGFloat xcenter = scrollView.center.x , ycenter = scrollView.center.y;
    
    //目前contentsize的width是否大于原scrollview的contentsize,如果大于,设置imageview中心x点为contentsize的一半,以固定imageview在该contentsize中心。如果不大于说明图像的宽还没有超出屏幕范围,可继续让中心x点为屏幕中点,此种情况确保图像在屏幕中心。
    
    xcenter = scrollView.contentSize.width >     scrollView.frame.size.width ? scrollView.contentSize.width/2 : xcenter;
    
    ycenter = scrollView.contentSize.height > scrollView.frame.size.height ? scrollView.contentSize.height/2 : ycenter;
    
    [self.showImage setCenter:CGPointMake(xcenter, ycenter)];
    
    }
    

    快速缩放使用了巧招

    -(void)sizeBtnImage:(UIButton *)sender{
    
    if (self.isScaleFit) {
    
    self.scrollView.zoomScale = fillScale;// 这个比例为按短边填满,长边等比放大。
    
    self.isScaleFit = NO;
    
    }else{
    
    self.scrollView.zoomScale = fitScale;// 这个比例为按长边填满,短边等比缩小。
    
    self.isScaleFit = YES;
    }
    }
    

    就是酱紫了,OK了

    相关文章

      网友评论

          本文标题:图片处理-缩放旋转裁剪

          本文链接:https://www.haomeiwen.com/subject/lanpkttx.html