如何从我的 CATiledLayer 中移除这些旋转伪影?

Posted

技术标签:

【中文标题】如何从我的 CATiledLayer 中移除这些旋转伪影?【英文标题】:How do I remove those rotation artefacts from my CATiledLayer? 【发布时间】:2011-02-05 03:16:45 【问题描述】:

我有一个 CATiledLayer,我通过以下方法将内容渲染到其中

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx

我使用 QuartzDemo 代码来绘制图案。在我对图层的 parentLayer(一个 UIView)应用旋转变换之前,这非常有效:

旋转:

当我开始在 CATiledLayer 中绘制线条和文本时,这些锯齿形伪影会变得更糟。

我按如下方式应用了变换(我也尝试在视图本身上使用仿射变换):

self.containerView.layer.transform = CATransform3DMakeRotation(angleRadians, 0.0f, 0.0f, 1.0f);

我转换的是 containerView 而不是层本身,因为我在该视图中有几个层,我想同时旋转而不改变相对位置。

过去我在旋转 UIImageViews 时没有遇到问题。

有没有办法让我旋转 CATiledLayer 而不会出现这些问题?

任何帮助将不胜感激。

你的,

菲利克斯

【问题讨论】:

【参考方案1】:

我发现解决此问题的唯一方法是:

    将图层绘制到位图上下文中 将该上下文的CGImageRef设置为图层内容

【讨论】:

只是一个澄清的评论。当您执行这两个步骤时,由于“纹理过滤”,网格将显得平滑(请参阅@EmilEriksson 的答案)。【参考方案2】:

OpenGL 中的抗锯齿通常很昂贵,因此由于处理资源有限,因此在 ios 上禁用了 Core Animation。这里的关键词是速度:Core Animation 针对绘制速度进行了优化,这转化为动画的平滑度。如果图像质量是首要任务,则不应将 Core Animation 与旋转变换一起使用。

对于 Core Animation 中的某些任务,您可以在图层内容周围添加 1 px 边框。如果没有抗锯齿,边缘会出现锯齿状,但当内容不在边缘时,则不受此影响,而是会因为纹理过滤而被平滑。

【讨论】:

【参考方案3】:

正如 Ryan Zachry 已经指出的那样,抗锯齿将在这里为您提供帮助。您在这里遇到的效果是“楼梯”效果。

像素是正方形的,因此很容易绘制直线(水平或垂直)而不会产生任何伪影。如果您以一定角度绘制线条,则需要对线条进行光栅化。尝试将线条映射到像素时,线条绘制算法需要进行近似计算。这种算法的一个例子是Bresenham's(非常流行且易于实现,但没有抗锯齿功能)。 它的作用如下:

在这张图中你可以很清楚地看到,在任何角度画一条线都会产生所谓的阶梯效应。为了避免这种影响,您可以使用抗锯齿。抗锯齿实际上是信号理论的一部分。它是一种在以较低分辨率表示高分辨率信号时最小化被称为混叠的失真伪影的技术。从上面的线条示例可以看出,这非常适用于计算机图形。

抗锯齿确实很复杂,但其想法是通过不仅在每个像素的基础上近似线条而且还使用智能着色使线条出现在某个非像素的位置来增强图片-准确的。

要在 Core Graphics 中启用内置抗锯齿功能,请在执行旋转之前执行以下操作:

CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);

请注意,抗锯齿在处理能力方面可能非常昂贵,您应该只在必要时使用它。

【讨论】:

不幸的是,这并没有奏效。绘制时,线条已正确消除锯齿。该问题仅在转换时出现。来自文档:创建窗口或位图上下文时,默认情况下会打开抗锯齿功能。

以上是关于如何从我的 CATiledLayer 中移除这些旋转伪影?的主要内容,如果未能解决你的问题,请参考以下文章

从 NavigationController 中移除 ViewController 后 AVPlayer 继续播放

从 Android Studio 中移除项目

如何观察 NSManagedObject 是不是从 managedObjectContext 中移除

CATiledLayer 在 iPad 第 3 代放大时被移除和刷新

iPhone:按下时如何从 UIBarButtonItem 中移除发光(光)?

SKSpriteNode 从场景中移除后如何停止音频(Swift)?