Как я удаляю те артефакты вращения из своего CATiledLayer?

У меня есть CATiledLayer, в котором я представляю содержание в следующем методе

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

Я использовал код QuartzDemo потянуть шаблон. Это работает очень хорошо, пока я не подаю заявку, вращение преобразовывают к parentLayer слоя (UIView):

Non-Rotated CATiledLayer

повернутый:

Rotated CATiledLayer

Эти зигзагообразные артефакты становятся хуже, когда я начинаю проводить линии и тексты в CATiledLayer.

Я применил преобразование следующим образом (я также пытался использовать аффинное преобразование на самом представлении):

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

Я преобразовываю containerView, а не сам слой, поскольку у меня есть несколько слоев в том представлении, что я хотел бы вращаться одновременно, не меняя относительные положения.

У меня не было проблем при вращении UIImageViews в прошлом.

Существует ли способ, которым я могу повернуть CATiledLayer без этих проблем?

Любая справка значительно ценилась бы.

Ваш,

Felix

6
задан Felix Lamouroux 7 April 2010 в 06:39
поделиться

3 ответа

Единственный способ исправить эту проблему, который я обнаружил, заключался в следующем:

  1. Нарисовать слой в контексте растрового изображения
  2. Установить CGImageRef этого контекста как содержимое слоя
3
ответ дан 17 December 2019 в 00:06
поделиться

Возможно, это поможет: быстрое и грязное сглаживание ... . В частности, убедитесь, что сглаживание включено.

CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
1
ответ дан 17 December 2019 в 00:06
поделиться

Как уже отмечал Райан Закри, здесь вам поможет сглаживание. Эффект, который вы здесь испытываете, называется эффектом «лестницы».

Пиксели имеют квадратную форму, поэтому можно легко рисовать прямые линии (горизонтальные или вертикальные) без каких-либо артефактов. Если вы рисуете линии под углом, вам нужно будет растрировать линию. Алгоритм рисования линий должен будет сделать приближения при попытке сопоставить линию с пикселями. Примером такого алгоритма является Брезенхэма (очень популярный и простой в реализации, но не имеющий сглаживания). Вот что он делает:

From wikipedia

Как вы можете очень ясно видеть на На этой картинке, проведя линию под любым углом, получается так называемый эффект лестницы. Чтобы избежать этого эффекта, вы можете использовать сглаживание. Сглаживание фактически является частью теории сигналов. Это метод минимизации артефактов искажения, известный как наложение спектров при представлении сигнала высокого разрешения при более низком разрешении. Как видно из приведенного выше примера строки, это очень хорошо применимо к компьютерной графике.

Сглаживание действительно сложно, но идея состоит в том, чтобы улучшить изображение, аппроксимируя линию не только на попиксельной основе, но также используя интеллектуальную окраску, чтобы линия появлялась в определенном месте, отличном от пикселя. точный.

From Wikipedia

Чтобы включить встроенное сглаживание в Core Graphics, сделайте следующее перед выполнением ротации:

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

Обратите внимание, что сглаживание может быть очень дорогостоящим с точки зрения вычислительной мощности, вы должны использовать его только при необходимости.

1
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: