Search code examples
iphoneobjective-ciosuiimageviewuiimage

How to unerase an erased UIImage?


I am trying an image erasing code in my PanGesture. I am using the code below:

 UIImage * image  = [UIImage imageNamed:@"326d4fb72362a2e44659141cadfc4977.jpg"];
 holderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 235)];
 imgForeground = [[UIImageView alloc] initWithFrame:[holderView frame]];
 [imgForeground setImage:image];
 [holderView addSubview:imgForeground];


 UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
 [panRecognizer setMinimumNumberOfTouches:1];
 [panRecognizer setMaximumNumberOfTouches:1];
 [panRecognizer setDelegate:self];
 [holderView addGestureRecognizer:panRecognizer];
 [self.view addSubview:holderView];

Then I am handling this here:

 -(void)move:(id)sender {

    CGPoint currentPoint;
    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan){
        
        lastPoint =  [sender locationInView:imgForeground];
        lastPoint.y -=20;
    }
    else{
    
        currentPoint = [sender locationInView:imgForeground];;
        currentPoint.y -=20;
    }
   
    
    UIGraphicsBeginImageContext(imgForeground.frame.size);
    [imgForeground.image drawInRect:CGRectMake(imgForeground.frame.origin.x, imgForeground.frame.origin.y, imgForeground.frame.size.width, imgForeground.frame.size.height)];
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineCap(context,kCGLineCapRound); //kCGImageAlphaPremultipliedLast);
    CGContextSetLineWidth(context, 10);
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(context, lastPoint.x, lastPoint.y);
    CGContextStrokePath(context);
    imgForeground.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

 }

How to unerase the same image?


Solution

  • I have the same issue in my app after the long search i found the simple solution for this issue.

    i just used touches methods of the UIViewController

    The below is the my approach,

    Code:-

       #pragma mark touches stuff...
    
    
    
     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
            UITouch *touch = [touches anyObject];
            lastTouch = [touch locationInView:self.editedImageView];
        }
    
        - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
            UITouch *touch = [touches anyObject];
            currentTouch = [touch locationInView:self.editedImageView];
    
            CGFloat brushSize;
            if (isEraser) 
            {
                brushSize=eraser;
            }
            else
            {
                brushSize=mark;
            }
            CGColorRef strokeColor = [UIColor whiteColor].CGColor;
    
            UIGraphicsBeginImageContext(self.editedImageView.frame.size);
            CGContextRef context = UIGraphicsGetCurrentContext();
            [self.editedImageView.image drawInRect:CGRectMake(0, 0, self.editedImageView.frame.size.width, self.editedImageView.frame.size.height)];
            CGContextSetLineCap(context, kCGLineCapRound);
            CGContextSetLineWidth(context, brushSize);
            if (isEraser) {
    
                CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [UIColor colorWithPatternImage:self.im].CGColor);
            }  
            else
            {
                CGContextSetStrokeColorWithColor(context, strokeColor);
                CGContextSetBlendMode(context, kCGBlendModeClear); 
            }
            CGContextBeginPath(context);
            CGContextMoveToPoint(context, lastTouch.x, lastTouch.y);
            CGContextAddLineToPoint(context, currentTouch.x, currentTouch.y);
            CGContextStrokePath(context);
            self.editedImageView.image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
    
            lastTouch = [touch locationInView:self.editedImageView];
        }
    
        - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
        {
    
        }
    

    The Inputs:

    self.editedImageView.image = "Your Custom image";
    
    self.im    =   "Your Custom image";
    

    The simple solution of your problem will be :-

    CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [UIColor colorWithPatternImage:self.im].CGColor);
    

    Note:

    This not unerase it again drawing the image over

    Update:-

     self.im    =   "Your Custom image";
    

    this will be like this....

    -(void)eraserConfigure
    {
        UIImageView *resizeImage=[[[UIImageView alloc]initWithImage:editedImage]autorelease];
        /*UIImage */self.im=[UIImage imageFromView:resizeImage scaledToSize:CGSizeMake(self.editedImageView.frame.size.width, self.editedImageView.frame.size.height)];
    }