Как удалить эти артефакты вращения из моего CATiledLayer? - PullRequest
6 голосов
/ 07 апреля 2010

У меня есть 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);

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

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

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

Любая помощь будет принята с благодарностью.

Ваш

Felix

Ответы [ 4 ]

3 голосов
/ 16 апреля 2010

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

  1. Нарисуйте слой в растровом контексте
  2. Установить CGImageRef этого контекста в качестве содержимого слоя
2 голосов
/ 17 января 2011

Сглаживание в OpenGL часто стоит дорого и поэтому отключено для Core Animation на iOS, так как ресурсы обработки ограничены. Ключевое слово здесь - скорость: Core Animation оптимизирована для скорости рисования, что означает плавность анимации. Если качество изображения является приоритетом, не следует использовать Core Animation с вращательными преобразованиями.

Для некоторых задач в Core Animation вы можете добавить рамку размером 1 px вокруг содержимого вашего слоя. Без сглаживания края будут зазубренными, но когда содержимое не на краю, это не будет затронуто и вместо этого будет сглажено из-за фильтрации текстуры.

1 голос
/ 14 апреля 2010

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

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

From wikipedia

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

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

From Wikipedia

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

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

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

1 голос
/ 10 апреля 2010

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

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