Стирание на 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]()