图像物镜 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 上的擦除功能的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的擦除插入习语?

迭代器 - c ++ 11中没有匹配的擦除函数

反射中泛型的擦除赋值

AndroidJava泛型的擦除

java泛型--泛型的擦除

stl中字符串中的擦除关键字的工作?