Стирание на UIImageView

Как я могу стереть содержимое на переднем UIImage, проверив его на нем и отобразив UIImage, который является обратной стороной UIView.

Я использовал следующий код в - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event для стирания переднего изображения:

-(void)eraseDrawingContents
{
    UIGraphicsBeginImageContext(frontImage.frame.size);
    [frontImage.image drawInRect:CGRectMake(0, 0, frontImage.frame.size.width, frontImage.frame.size.height)];

    CGContextSaveGState(UIGraphicsGetCurrentContext());
    CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 25.0);
    CGContextSetShadowWithColor(UIGraphicsGetCurrentContext(), CGSizeMake(0, 0), 50, [[UIColor whiteColor]CGColor]);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, lastPoint.x, lastPoint.y);
    CGPathAddLineToPoint(path, nil, currentPoint.x, currentPoint.y);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
    CGContextAddPath(UIGraphicsGetCurrentContext(), path);
    CGContextStrokePath(UIGraphicsGetCurrentContext());

    frontImage.image = UIGraphicsGetImageFromCurrentImageContext();
    CGContextRestoreGState(UIGraphicsGetCurrentContext());
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;
}

Я получил следующий результат.

enter image description here

Но мне нужен вывод вроде этого.

enter image description here

Как мы можем достичь этой функциональности?

Пожалуйста, помогите мне.

Ответ 1

Попробуйте это

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{


    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];


   self.imgView.image = [self.imgView.image eraseImageAtPoint:location inImageView:self.imgView  fromEraser:eraserImg];



}



- (UIImage *)eraseImageAtPoint: (CGPoint)point inImageView: (UIImageView *)imgView fromEraser: (UIImage *)eraser
{
    UIGraphicsBeginImageContext(imgView.frame.size);

    [self drawInRect:CGRectMake(0, 0, imgView.frame.size.width, imgView.frame.size.height)];

    [eraser drawAtPoint:point blendMode:kCGBlendModeDestinationOut alpha:1.0];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;

}

И используйте приведенное ниже изображение как ластик, это отлично сработает для вас.

eraser image

Этот код работает в моем конце, дайте мне следующий результат: imqage 1

image 2

image 3

image 4

Ответ 2

Вы можете достичь этого путем смешивания двух изображений

Существует много способов, чтобы простой способ был ниже, вы также можете использовать GPUImage.

просто вам нужно соединить два изображения с нужным выводом.

Смешайте два изображения друг с другом.

Смешайте больше, чтобы попробовать

**kCGBlendModeOverlay,kCGBlendModeSoftLight,kCGBlendModeColorDodge,etc**

в CGBlendMode в нижеприведенной функции. Есть еще много вариантов для чересчур двух изображений и слияния.. (даже с живой камерой вы также можете это сделать)

-(UIImage *)blenimagwithimage:(NSString *)imagename mode:(CGBlendMode)kmode with:(float)opeticy
    {
        processedimage=nil;
        UIImage *inputImage;
        inputImage = [UIImage imageNamed:imagename];
        UIGraphicsBeginImageContext(originalImage.size);
        [originalImage drawInRect:CGRectMake(0.0, 0.0, originalImage.size.width, originalImage.size.height)];
        [inputImage drawInRect:CGRectMake(0.0, 0.0, originalImage.size.width, originalImage.size.height) blendMode:kmode alpha:opeticy];
        UIImage *layeredImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return layeredImage;
    }

Ответ 3

проверьте этот пример кода

он предоставляет такую ​​функциональность, как это

enter image description here

enter image description here