繁体   English   中英

使用UIBezierPath异步剪辑UIImage

[英]Clip UIImage with UIBezierPath Asynchronously

我想在不使用QuartzCore的情况下为UIImageView添加圆角以避免UIScrollView中的性能问题,所以我解决了它:

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)];
    [path addClip];

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [[UIScreen mainScreen] scale]);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(UIGraphicsGetCurrentContext( ),kCGBlendModeClear); CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);
    CGContextAddPath(context,path.CGPath);
    CGContextClip(context);
    CGContextClearRect(context,CGRectMake(0,0,width,height));

    [_image drawInRect:rect];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

遗憾的是,在drawRect中调用,这需要一点处理时间,这会在UIScrollView中滚动时产生滞后。 因此,我试图在dispatch_async的帮助下在一个单独的线程中处理它。 这消除了滞后,一切都顺利进行。 但现在我有另一个问题。 我在调试器中收到许多无效的上下文消息,因为当线程异步启动图像处理时,GraphicsContext并不总是存在。 有没有办法处理我的图像中的圆角而不会得到无效的上下文消息? 请注意,我不想使用QuarzCore的cornerRadius或mask-functions。

你做的工作超出了你的需要。 在调用UIGraphicsBeginImageContextWithOptions()之前调用[path addClip]会导致“无效上下文”消息。 UIBezierPath尝试访问线程的当前图形上下文,但尚未设置。

这是获得相同结果的更简单方法。 请注意,您根本不需要使用CGContext

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)];
[path addClip];

[_image drawInRect:rect];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我想在不使用QuartzCore的情况下为UIImageView添加圆角以避免性能问题

一种方法是围绕图像的角而不是UIImageView的角。 在这里看到我的答案:

https://stackoverflow.com/a/8125604/341994

我们从任何UIImage开始,并通过绘制到剪切的上下文来绕过它的角。 这不需要“处理时间”并且不会导致性能问题。

注意:在表格视图或其他非常快速的滚动或动画情况下,可能会出现由圆角处的透明度引起的性能问题。但这是一个更普遍的问题,如果没有完成舍入的话,几乎没有办法;它与我们必须不断地将移动的形状合成到背景上的事实有关。如果背景是纯色并且事先知道它将是什么,那么在圆角区域制作不透明图像会更有效有背景的颜色。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM