gpt4 book ai didi

ios - 如何使用手势识别器在大图像上画线而不会出现内存问题

转载 作者:行者123 更新时间:2023-11-29 04:25:27 27 4
gpt4 key购买 nike

我正在开发一个应用程序,有时用户需要在图像上绘制一些内容。我编写的代码适用于 1500x1500 左右及更小的图像,但一旦图像变大,问题就开始了。

当图像太大时,绘图需要更多时间,并且手势识别器很少被调用。

我是这样做的:有两个类,一个是名为 DrawViewUIScrollView 子类,一个是名为 UIImageView 子类 MyPenDrawView 有一个 UIPanGestureRecognizer,每次识别时都会向 MyPen 发送消息(我得到 [识别器状态]并根据它开始或移动一条线)。 DrawView 在其 subview 中有两个 UIImageView 对象,一个用于背景图像,另一个用于绘图(笔)。

这是我在 MyPen 中执行的操作:

- (void)beginLine:(CGPoint) currentPoint
{
previousPoint = currentPoint;
}

- (void)moveLine:(CGPoint) currentPoint
{
self.image = [self drawLineFromPoint:previousPoint toPoint:currentPoint image:self.image];
previousPoint = currentPoint;
}

- (UIImage *)drawLineFromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint image:(UIImage *)image
{
CGSize screenSize = self.frame.size;
UIGraphicsBeginImageContext(screenSize);
CGContextRef currentContext = UIGraphicsGetCurrentContext();
[image drawInRect:CGRectMake(0, 0, screenSize.width, screenSize.height)];

CGContextSetLineCap(currentContext, kCGLineCapRound);
CGContextSetLineWidth(currentContext, _thickness);
CGContextSetStrokeColorWithColor(currentContext, _color);
CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, fromPoint.x, fromPoint.y);
CGContextAddLineToPoint(currentContext, toPoint.x, toPoint.y);
CGContextStrokePath(currentContext);

UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return ret;
}

当图像足够大时,CoreGraphics 需要一些时间来渲染它,因此手势识别器不会经常被识别,并且向笔发送较少的点。

这里的问题是:有没有办法优化绘图?我应该为 ir 使用另一个线程吗?还有其他办法吗?非常感谢任何帮助。

最佳答案

您应该将前景(线条)和背景(应在其上绘制线条的图像)分成两个 View 。所以只能在用户每次移动手指时更新前台View。当用户完成绘图时,您可以将两个 View 合成为一张图像。

在 CGContext 中绘制图像非常昂贵,特别是当图像很大时。

关于ios - 如何使用手势识别器在大图像上画线而不会出现内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12389554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com