裁剪图片(自定义裁剪范围)

网上现在有很多的图片剪切和从图片库中取出图片并截取的demo,但是大部分都是固定的大小,而且我们系统本来就带可编辑的图片裁剪功能。不过那个是正方形的,并不适用于我们多变的需求。
1.做裁剪图片需要先放一个父view,然后再在上面放原始图片imageview最后还需要一个裁剪图片的区域,为了防止用view会遮盖屏幕,到时候想滑动图片,缩放图片的时候就会遇到麻烦,所以需要用layer,就是之前博客提到的用calayer绘图,将编辑框画出来。这样既有了裁剪范围又不会遮挡界面手势。
2.父view和手势代码如下

 //声明需要切图的可滑动的背景
    self.originImageBoardView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64)];
    self.originImageBoardView.clipsToBounds = YES;
    [self.view addSubview:self.originImageBoardView];
     //缩放图片
    UIPinchGestureRecognizer *pinchOriginGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureAction:)];
    //移动图片
    UIPanGestureRecognizer *panOriginGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureAction:)];
    panOriginGestureRecognizer.maximumNumberOfTouches = 1;

    [self.originImageBoardView addGestureRecognizer:pinchOriginGestureRecognizer];
    [self.originImageBoardView addGestureRecognizer:panOriginGestureRecognizer];

大图片的view

//声明原图
    self.originImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-64)];
    self.originImageView.image = self.originImage;
    //UIViewContentModeScaleAspectFit(将图片全部显示出来等比例缩放到屏幕能放下图片为止,例如屏幕未铺满有,由于图片比例不同所以显示全部图片内容后必定有部分不会被图片显示出来)UIViewContentModeScaleAspectFill(将图片最小的部分显示出来,例如图片高度和宽度比例不同则全屏显示,可能高度或者宽度超出屏幕)
    self.originImageView.contentMode = UIViewContentModeScaleAspectFit;
    [self.originImageBoardView addSubview:self.originImageView];

编辑框的代码

-(void)cutImageWithPath
{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(0, (SCREEN_HEIGHT+64-SCREEN_WIDTH/1.8)/2)];
    [path addLineToPoint:CGPointMake(SCREEN_WIDTH, (SCREEN_HEIGHT+64-SCREEN_WIDTH/1.8)/2)];
    [path addLineToPoint:CGPointMake(SCREEN_WIDTH, (SCREEN_HEIGHT+64+SCREEN_WIDTH/1.8)/2)];
    [path addLineToPoint:CGPointMake(0, (SCREEN_HEIGHT+64+SCREEN_WIDTH/1.8)/2)];
    [path closePath];
    CAShapeLayer *myLayer = [CAShapeLayer layer];
    myLayer.fillColor = [UIColor clearColor].CGColor;
    myLayer.strokeColor = [UIColor whiteColor].CGColor;
    myLayer.path = path.CGPath;
    myLayer.lineWidth=1;
    [self.view.layer addSublayer:myLayer];
}

两个手势的实现方法

- (void)pinchGestureAction:(UIPinchGestureRecognizer *)gestureRecognizer {

    UIView *gestureView = gestureRecognizer.view;
        gestureView = self.originImageView;
    CGAffineTransform affineTransform = CGAffineTransformScale(gestureView.transform,gestureRecognizer.scale, gestureRecognizer.scale);
    gestureView.transform = affineTransform;
    gestureRecognizer.scale = 1;
}

- (void)panGestureAction:(UIPanGestureRecognizer *)gestureRecognizer {
    UIView *gestureView = gestureRecognizer.view,
    *gestureViewSuperView = gestureView.superview;
    BOOL needPaddingDistance = NO;
    gestureView = self.originImageView;
    needPaddingDistance = NO;

    CGPoint touchPoint = [gestureRecognizer locationInView:gestureView.superview];

    if(gestureRecognizer.state == UIGestureRecognizerStateChanged) {
        CGPoint centerPoint = CGPointMake(gestureView.center.x + touchPoint.x - PreviousTapPoint.x, gestureView.center.y + touchPoint.y - PreviousTapPoint.y);
        if(needPaddingDistance) {
            CGFloat w = CGRectGetWidth(gestureView.frame),
            h = CGRectGetHeight(gestureView.frame);
            CGRect tempFrame = CGRectMake(centerPoint.x - w / 2, centerPoint.y - h / 2, w, h);
            if(!CGRectContainsRect(gestureViewSuperView.frame, tempFrame)) {
                return;
            }
        }
        gestureView.center = centerPoint;
    }
    PreviousTapPoint = touchPoint;
    [gestureRecognizer setTranslation:CGPointZero inView:gestureView.superview];
}

3.最后要上实现切图的代码

UIGraphicsBeginImageContext(self.originImageBoardView.bounds.size); //currentView 当前的view
    [self.originImageBoardView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *originFullImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CGImageRef imageRef = originFullImage.CGImage;
    CGImageRef imagePartRef = CGImageCreateWithImageInRect(imageRef, self.cropView.frame);
    UIImage *cropImage = [UIImage imageWithCGImage:imagePartRef];
    CGImageRelease(imagePartRef);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中自定义图片裁剪可以通过使用自定义View和Bitmap对象来实现。以下是一些步骤: 1. 创建自定义View类,继承自View类。在onDraw()方法中绘制Bitmap对象。 2. 设置触摸事件,获取用户手指操作的坐标,计算出裁剪区域的左上角和右下角坐标。 3. 在onTouchEvent()方法中重绘View,绘制裁剪后的Bitmap对象。 4. 使用Matrix对象进行缩放和旋转操作。 下面是一个简单的示例代码: ``` public class CropImageView extends View { private Bitmap mBitmap; private Paint mPaint; private Rect mRect; private Matrix mMatrix; private float mStartX; private float mStartY; private float mEndX; private float mEndY; public CropImageView(Context context) { super(context); init(); } public CropImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5); mPaint.setColor(Color.RED); mRect = new Rect(); mMatrix = new Matrix(); } public void setImageBitmap(Bitmap bitmap) { mBitmap = bitmap; invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mBitmap != null) { canvas.drawBitmap(mBitmap, mMatrix, null); } canvas.drawRect(mRect, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mStartX = event.getX(); mStartY = event.getY(); mEndX = mStartX; mEndY = mStartY; break; case MotionEvent.ACTION_MOVE: mEndX = event.getX(); mEndY = event.getY(); break; case MotionEvent.ACTION_UP: mEndX = event.getX(); mEndY = event.getY(); break; } calculateRect(); invalidate(); return true; } private void calculateRect() { float left = Math.min(mStartX, mEndX); float top = Math.min(mStartY, mEndY); float right = Math.max(mStartX, mEndX); float bottom = Math.max(mStartY, mEndY); mRect.set((int) left, (int) top, (int) right, (int) bottom); float centerX = (left + right) / 2; float centerY = (top + bottom) / 2; mMatrix.reset(); mMatrix.postTranslate(-centerX, -centerY); mMatrix.postRotate(45); mMatrix.postScale(0.5f, 0.5f); mMatrix.postTranslate(centerX, centerY); } } ``` 这个示例代码实现了一个简单的图片裁剪功能,并在裁剪后对图片进行了缩放和旋转。你可以根据自己的需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值