2010-04-07 2 views
6

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

ответ

3

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

  1. Draw слой в контексте
  2. растровый Установите функцию CGImageRef этого контекста в качестве содержимого слоя
+0

Хотелось бы, чтобы вы могли разработать код или ссылку. – Ovesh

+0

Просто поясняющее замечание. Когда вы выполните эти два шага, сетка будет выглядеть гладко из-за «фильтрации текстур» (см. Ответ @ EmilEriksson). – bentford

1

Возможно, это поможет: quick and dirty anti-aliasing.... В частности, защита от сглаживания включена.

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

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

+0

AntiAliasing включен по умолчанию. – bentford

1

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

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

From wikipedia

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

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

From Wikipedia

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

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

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

+0

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

2

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

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

Смежные вопросы