ios - 如何改善绘图和更新大图像性能?

时间:2015-06-08 02:30:06

标签: ios objective-c uiimage core-image

我正在开发iOS中的选择性颜色应用程序(App Store中有许多类似的应用程序,例如:https://itunes.apple.com/us/app/color-splash/id304871603?mt=8)。我的想法很简单:使用两个UIViews,一个用于前景(黑白图像),一个用于背景(彩色图像)。我使用touchesBegan,touchesMoved等事件来跟踪前台的用户输入。在移动的触摸中,我使用kCGBlendModeClear来擦除用户移动手指的路径。最后,我将UIViews中的两个图像组合在一起以获得结果。结果将显示在前景视图中。

为了实现这个想法,我写了两个不同的工具。它们适用于小图像,但是对于大图像(> 3MB)非常慢。

在第一个版本中,我使用了两个UIImageViews(imgForegroundView和imgBackgroundView)。 这是用户将手指从点p1移动到点p2时获取图​​像结果的代码。此代码将从touchesMoved事件中调用:

-(UIImage*)getImageWithPoint:(CGPoint)p1 andPoint:(CGPoint)p2{

UIGraphicsBeginImageContext(originalImg.size);

[self.imgForegroundView.image drawInRect:CGRectMake(0, 0, originalImg.size.width, originalImg.size.height)];

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetBlendMode(context, kCGBlendModeClear);
CGContextSetAllowsAntialiasing(context, TRUE);
CGContextSetLineWidth(context, brushSize);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetRGBStrokeColor(context, 1, 0, 0, 1.0);

CGContextBeginPath(context);
CGContextMoveToPoint(context, p1.x, p1.y);
CGContextAddLineToPoint(context, p2.x, p2.y);

CGContextStrokePath(context);

UIImage* result = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return result;   
}

获取图像结果后,我用它替换imgForegroundView.image。

在版本2中,我在http://www.effectiveui.com/blog/2011/12/02/how-to-build-a-simple-painting-app-for-ios/中使用了idea。背景仍然是UIImageView,但前景是UIView的子类。在前台,我使用缓存上下文来存储图像。当用户移动手指时,我绘制缓存上下文,然后通过覆盖drawRect方法更新视图。在drawRect方法中,我从缓存上下文中获取图像并将其绘制到当前上下文中。

- (void) drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGImageRef cacheImage = CGBitmapContextCreateImage(cacheContext);
CGContextDrawImage(context, self.bounds, cacheImage);
CGImageRelease(cacheImage);
}

然后,与第一个版本一样,我从前景获取图像并将其与背景相结合。

使用小图像(<= 2 MB),两种版本都可以正常工作。但是对于较大的图像,它是非常可怕的:在用户长时间移动手指(3 - 5秒,取决于图像大小)后,图像将被更新。 我希望我的应用程序可以实现接近实时的速度,例如上面的示例应用程序,但我不知道该怎么做。谁能给我一些建议?

0 个答案:

没有答案