6

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

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

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

非旋转CATiledLayer

旋转:

旋转的CATiledLayer

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

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

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

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

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

有没有办法可以在没有这些问题的情况下旋转 CATiledLayer?

任何帮助将不胜感激。

你的,

菲利克斯

4

3 回答 3

3

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

  1. 将图层绘制到位图上下文中
  2. 将该上下文的 CGImageRef 设置为图层内容
于 2010-04-16T09:24:10.397 回答
2

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

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

于 2011-01-17T12:39:17.760 回答
1

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

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

来自维基百科

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

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

来自维基百科

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

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

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

于 2010-04-14T11:07:13.420 回答