2010-04-07 7 views
6

Ich habe einen CATiledLayer, in die I-Gehalt in dem folgenden Verfahren machenWie entferne ich diese Rotationsartefakte aus meinem CATiledLayer?

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

I die QuartzDemo Code verwendet, um ein Muster zu zeichnen. Das funktioniert sehr gut, bis ich eine Drehung auf die Ebene des parentLayer (a UIView) Transformation anwenden:

Non-Rotated CATiledLayer

gedreht:

Rotated CATiledLayer

Diese Zick-Zack-Artefakte werden schlimmer, wenn ich anfangen Zeichnen von Linien und Texte in den CATiledLayer.

I angewendet der Transformation wie folgt (I auch versucht, eine affine Transformation auf die Ansicht selbst verwendet wird):

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

Transformation ich die containerView eher als die Schicht selbst, wie ich in dieser Ansicht mehrere Schichten aufweisen, die Ich möchte gleichzeitig drehen, ohne die relativen Positionen zu ändern.

Ich hatte keine Probleme beim Drehen UIImageViews in der Vergangenheit.

Gibt es eine Möglichkeit, dass ich den CATiledLayer ohne diese Probleme drehen kann?

Jede Hilfe würde sehr geschätzt werden.

Mit freundlichen Grüßen

Felix

Antwort

3

Der einzige Weg, um dieses Problem der Festsetzung Ich war gefunden:

  1. die Schicht in eine Bitmap-Kontext Zeichnen
  2. Stellen Sie den CGImageRef dieser Zusammenhang als die Schicht Inhalt
+0

Ich wünschte, Sie könnten mit etwas Code oder einem Link ausarbeiten. – Ovesh

+0

Nur eine klärende Bemerkung. Wenn Sie diese beiden Schritte ausführen, wird das Raster durch "Texturfilterung" glatt angezeigt (siehe @ EmilEriksson-Antwort). – bentford

1

Vielleicht wird dies helfen: quick and dirty anti-aliasing.... Insbesondere wird sichergestellt, dass Anti-Aliasing aktiviert ist.

+0

Leider hat dies nicht den Trick gemacht. Die Linien sind beim Zeichnen korrekt antialiasiert. Das Problem tritt nur bei der Transformation auf. Aus der Dokumentation: Anti-Aliasing ist standardmäßig aktiviert, wenn ein Fenster- oder Bitmap-Kontext erstellt wird. – FelixLam

+0

AntiAliasing ist standardmäßig aktiviert. – bentford

1

Wie Ryan Zachry bereits darauf hingewiesen hat, wird Ihnen Anti-Aliasing hier helfen. Der Effekt, den Sie hier erleben, ist der "Treppeneffekt".

Pixel sind quadratisch, so dass es einfach ist, gerade Linien (horizontal oder vertikal) zu zeichnen, ohne Artefakte zu erzeugen. Wenn Sie Linien in einem Winkel zeichnen, müssen Sie Ihre Linie rastern. Ein Algorithmus für die Linienzeichnung muss Approximationen vornehmen, wenn er versucht, die Linie den Pixeln zuzuordnen. Ein Beispiel für einen solchen Algorithmus ist Bresenham's (sehr beliebt und einfach zu implementieren, jedoch ohne Anti-Aliasing). Hier ist, was es tut:

From wikipedia

Wie Sie ganz klar in diesem Bild sehen können, eine Linie in einem beliebigen Winkel Ergebnisse in dem so genannten Treppeneffekt zeichnen. Um diesen Effekt zu vermeiden, können Sie Anti-Aliasing verwenden. Anti-Aliasing ist eigentlich ein Teil der Signaltheorie. Es ist die Technik der Minimierung der Verzerrungsartefakte, die als Aliasing bekannt sind, wenn ein hochauflösendes Signal mit einer niedrigeren Auflösung dargestellt wird. Wie Sie aus dem Zeilenbeispiel oben sehen können, gilt dies sehr gut für Computergrafiken. Das Anti-Aliasing ist sehr kompliziert, aber die Idee besteht darin, das Bild zu verbessern, indem die Zeile nicht nur pixelweise approximiert wird, sondern auch eine intelligente Einfärbung verwendet wird, um die Linie an einer bestimmten Stelle erscheinen zu lassen, die kein Pixel ist -genau.

From Wikipedia

Um vor der Durchführung Ihrer Drehung in Core Graphics, gehen Sie wie folgt integrierte Anti-Aliasing zu aktivieren:

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

Beachten Sie, dass das Anti-Aliasing in Bezug auf die Rechenleistung kann sehr teuer sein sollten Sie es nur bei Bedarf verwenden.

+0

Leider hat das nicht den Trick gemacht. Die Linien sind beim Zeichnen korrekt antialiasiert. Das Problem tritt nur bei der Transformation auf. Aus der Dokumentation: Anti-Aliasing ist standardmäßig aktiviert, wenn ein Fenster- oder Bitmap-Kontext erstellt wird. – FelixLam

2

Anti- Aliasing in OpenGL ist oft teuer und daher für Core Animation unter iOS deaktiviert, da die Verarbeitungsressourcen begrenzt sind. Das Schlüsselwort hier ist Geschwindigkeit: Core Animation ist für die Geschwindigkeit des Zeichnens optimiert, was zu einer ruhigen Animation führt. Wenn die Bildqualität Priorität hat, sollten Sie Core-Animation nicht mit Rotationstransformationen verwenden.

Für einige Aufgaben in der Kernanimation können Sie einen 1-Pixel-Rahmen um Ihren Ebeneninhalt hinzufügen. Ohne Anti-Aliasing werden Kanten gezackt, aber wenn sich der Inhalt nicht auf einer Kante befindet, wird dies nicht beeinflusst und stattdessen durch Texturfilterung geglättet.

Verwandte Themen