gpt4 book ai didi

iOS 绘画优化

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:59 24 4
gpt4 key购买 nike

您好,我目前正在开发一款包含通过绘图做笔记的应用程序。我遵循了 ray wenderlich 教程,据我所知,我最终得到了这段代码:

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

mouseSwiped = NO;
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
CGFloat red,green,blue,alpha;

mouseSwiped = YES;
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self];



UIGraphicsBeginImageContext(self.mainImage.frame.size);
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height)];

CGContextSetBlendMode(UIGraphicsGetCurrentContext(),[self getBlendMode]);

CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x , lastPoint.y );
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x , currentPoint.y );
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), [self getBrushSize] );

[[self getPaintColor] getRed:&red green:&green blue:&blue alpha:&alpha];
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1);

CGContextSetBlendMode(UIGraphicsGetCurrentContext(),[self getBlendMode]);

CGContextStrokePath(UIGraphicsGetCurrentContext());
self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
[self.tempDrawImage setAlpha:[self getPaintAlpha]];
UIGraphicsEndImageContext();

lastPoint = currentPoint;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
CGFloat red,green,blue;

if(!mouseSwiped) {

UIGraphicsBeginImageContext(self.mainImage.frame.size);
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), [self getBrushSize]);

[[self getPaintColor] getRed:&red green:&green blue:&blue alpha:nil];
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, [self getPaintAlpha]);
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y - self.mainImage.frame.origin.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y - self.mainImage.frame.origin.y );
CGContextStrokePath(UIGraphicsGetCurrentContext());
CGContextFlush(UIGraphicsGetCurrentContext());
self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}

UIGraphicsBeginImageContext(self.mainImage.frame.size);

[self.mainImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height) blendMode:[self getBlendMode] alpha:1.0];
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height) blendMode:[self getBlendMode] alpha:[self getPaintAlpha]];
if(self.drawMode != DrawEraser)
{
self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();
self.tempDrawImage.image = nil;
}
UIGraphicsEndImageContext();
mouseSwiped = NO;
}

此代码在小框架上工作得很好,但当我将框架增加到比以前大 2 倍时,不幸的是性能不太好。所以我在考虑优化代码。我特别关注 touchesMoved 方法。据我了解,它在上下文中绘制整个图像并对其进行一些更改并将上下文分配给图像。绘制整个图像似乎重载了。所以我想知道,我是否可以将图像的某些部分绘制到上下文中并进行一些更改,然后将这部分上下文绘制到图像中。

最佳答案

你是对的 - 每次在 touchesMoved 中重新绘制整个图像是个坏主意。我认为您应该在开始时创建并保留对上下文的引用。在触摸移动中,您应该利用它并根据上下文创建图像。您可以使用 CGBitmapContextCreate() 来创建上下文而不是 UIGraphicsBeginImageContext()CGBitmapContextCreateImage() 从上下文而不是 UIGraphicsGetImageFromCurrentImageContext()。这是有关如何使用它们的文档 (https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGBitmapContext/Reference/reference.html)。

关于iOS 绘画优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17723696/

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