图像物镜 c 上的擦除功能
Posted
技术标签:
【中文标题】图像物镜 c 上的擦除功能【英文标题】:Erase functionality on image objective c 【发布时间】:2015-05-26 11:24:25 【问题描述】:我正在尝试制作贴纸应用程序。 需要的功能之一是擦除贴纸。
我已经可以擦除图像,但是如何降低橡皮擦的强度?
目前在 touchesMoved 功能上,
我正在使用此代码:
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:selectedFrame.imageView];
//erase part
UIGraphicsBeginImageContextWithOptions(selectedFrame.imageView.frame.size, NO, 0);
[selectedFrame.imageView.image drawInRect:CGRectMake(0, 0, selectedFrame.imageView.frame.size.width, selectedFrame.imageView.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(),5);
CGContextClearRect (UIGraphicsGetCurrentContext(), CGRectMake(lastPoint.x, lastPoint.y, 5, 5));
selectedFrame.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
这确实会正确擦除图像,但我想降低橡皮擦强度,因此它不会删除触摸时的所有图像,但会稍微降低图像的不透明度。 下面附上图片: 当前工作功能输出 - http://cloudart.com.au/projects/appscreenshots/Erased_image.png
所需的功能输出 - http://cloudart.com.au/projects/appscreenshots/app.png
基本上需要管理橡皮擦强度。任何帮助,将不胜感激。
【问题讨论】:
【参考方案1】:代码中的 2 行代码可以更改橡皮擦大小
橡皮擦大小设置为 5 像素,在以下 2 行中进行任何更改,将给定行中的 5 替换为您的大小。
CGContextSetLineWidth(UIGraphicsGetCurrentContext(),5);
CGContextClearRect (UIGraphicsGetCurrentContext(), CGRectMake(lastPoint.x, lastPoint.y, 5, 5));
【讨论】:
我实际上是在寻找橡皮擦强度而不是橡皮擦大小。无论如何感谢您的回答。 @vikrantRohilla 你说的strength
是什么意思?请详细说明一下。
强度是指橡皮擦强度。我基本上想降低橡皮擦强度,所以如果我擦除图像的一部分,它不会被完全删除,但会在触摸的那一点消失。
一个很好的参考是在应用程序 - itunes.apple.com/us/app/animal-face-ig-photo-editor/…,一旦你添加了一张脸,然后如果你尝试橡皮擦。这将清楚实际要求是什么。感谢所有的努力。
@vikrantRohilla 那么我认为你应该用更少的 alpha 填充白色而不是CGContextClearRect
。【参考方案2】:
感谢您的意见,但最后这对我有用 -
UIGraphicsBeginImageContextWithOptions(selectedFrame.imageView.frame.size, NO, 0);
[selectedFrame.imageView.image drawInRect:CGRectMake(0, 0, selectedFrame.imageView.frame.size.width, selectedFrame.imageView.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(),5);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeDestinationOut);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 0.1);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
selectedFrame.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
【讨论】:
【参考方案3】:UIGraphicsBeginImageContext(eraseimg1.frame.size);
[eraseimg1.image drawInRect:CGRectMake(0, 0,eraseimg1.frame.size.width, eraseimg1.frame.size.height)];
CGContextSetBlendMode(UIGraphicsGetCurrentContext( ),kCGBlendModeClear);
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext( ), 50);
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [[UIColor clearColor] CGColor]);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastTouch1.x, lastTouch1.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastTouch1.x, lastTouch1.y);
CGContextStrokePath(UIGraphicsGetCurrentContext()) ;
eraseimg1.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
【讨论】:
以上是关于图像物镜 c 上的擦除功能的主要内容,如果未能解决你的问题,请参考以下文章