Bild mit CGContextDrawImage drehen

8

Wie kann ich ein Bild um CGContextDrawImage() in seiner Mitte drehen?

In drawRect:

%Vor%

Ich zeichne das Bild am Ursprung und drehe es in seiner Mitte und setze es dann dorthin, wo es gezeichnet werden soll. Funktioniert nicht.

    
Morrowless 27.05.2013, 04:00
quelle

4 Antworten

33

Was Sie bei Koordinatentransformationen - nun, eins der zu merkenden Dinge - zu beachten haben, ist, dass Sie keine Objekte manipulieren, wie den Befehl Transform in einem Grafikeditor; Sie manipulieren den Raum selbst .

Stellen Sie sich vor, dass das Gerät mit einem Schwanenhalsarm über einem Schreibtisch hängt und in seiner Position fixiert ist. Koordinatentransformationen bewegen das Pult um (Translation) und drehen es in die eine oder andere Richtung (Rotation) und quetschen und dehnen es sogar (Skalierung).

Eine weitere Sache, die Sie bei Koordinatentransformationen beachten sollten, ist, dass die Transformation immer relativ zum Ursprung ist. Stellen Sie sich vor, dass Ihr Schreibtisch mit einer seiner Ecken - entsprechend einer Ecke Ihrer Ansicht - direkt unter der Ecke beginnt, wo Ihre Ansicht auf dem Bildschirm endet. Übersetzen verschiebt die Ecke des Schreibtisches und den Rest des Schreibtisches mit sich und verschiebt sie auf die eine oder andere Weise unter den Bildschirm. Drehen dreht den Schreibtisch um diese Ecke.

Noch eine Sache: Transformationen beeinflussen die Zukunft, nicht die Vergangenheit. Etwas zu zeichnen und dann zu versuchen, es zu transformieren, wird nicht funktionieren, weil du das, was du gezeichnet hast, nicht transformierst, transformierst du den Raum, in den du zeichnest. Also müssen wir den Schreibtisch verschieben, bevor wir das Bild an der richtigen Stelle platzieren können.

(Ich erwähne diesen letzten Teil, weil Sie ein paar Transformationsbefehle haben, die sofort durch Ihren CGContextRestoreGState -Aufruf rückgängig gemacht werden. Es gibt keine Zeichnung dazwischen, auf die sie Einfluss nehmen könnten.)

Beginnen wir also mit dem nicht gedrehten Rechteck des Bildes.

%Vor%

Nun verwendet CGContextDrawImage ein Rechteck, aber wie Sie wissen, wird das Bild aus der unteren linken Ecke dieses Rechtecks ​​und nicht aus der Mitte gezeichnet. (Daher diese ganze Übung.)

Also, hier ist, was Sie tun werden. Am Ende werden Sie das Bild nicht an dem oben gezeigten Punkt zeichnen, sondern am Nullpunkt - also an der Ecke des Schreibtisches. (Nicht um die Ecke zentriert, aber mit der Bildecke auf der Schreibtischecke.)

Wie wird das funktionieren? Es braucht etwas Setup. Du musst deinen Schreibtisch umziehen.

Zuerst müssen Sie Ihren Schreibtisch nach oben und nach rechts bewegen, bis die Ursprungsecke Ihres Schreibtischs den gewünschten Mittelpunkt erreicht hat:

%Vor%

Dann machen Sie die Drehung (drehen Sie den Schreibtisch um seine Ursprungsecke):

%Vor%

Dann bewegen Sie den Schreibtisch um nach unten und nach links um die Hälfte der Breite und Höhe des Bildes:

%Vor%

Und dann, schließlich, legen Sie das Bild auf der Ecke des Schreibtisches.

%Vor%

Wenn Ihr Schreibtisch so bewegt wird, liegt die Mitte dieses Rechtecks ​​direkt unter dem Punkt auf dem Bildschirm, an dem das Bild zentriert werden soll, sodass das Bild so zentriert ist.

    
Peter Hosey 28.05.2013, 02:28
quelle
1

Diese Funktion kann ein Bild auf einem vorhandenen Bild mit einem Rotationswinkel im Bogenmaß zeichnen.

Schnell 3:

%Vor%

Wenn Sie ein Bild mit Größe und Farbe erstellen und leeren müssen, verwenden Sie:

%Vor%     
akoruk 21.12.2016 13:01
quelle
0

Sie können die folgende Methode zum Drehen des Bildes verwenden.

%Vor%

Wenn Sie angle verwenden, dann ist hier das Makro zum Umwandeln von Grad in Radiant

%Vor%     
manujmv 27.05.2013 04:23
quelle
0

Wenn Sie letztendlich auf den Bildschirm zeichnen (anstatt ein Bild zu erzeugen, das in einer Datei gespeichert wird), sollten Sie möglicherweise keinen CGContext verwenden, sondern das Bild in einen CALayer einfügen und die Ebene über die Ebene drehen Ankerpunkt:

%Vor%

Wenn das Bild selbst erzeugt wird (im Gegensatz zu einer statischen Ressource aus Ihrem Bundle oder etwas, das vom Benutzer bereitgestellt wird), sollten Sie es in Erwägung ziehen, es aus Ebenen zu erstellen und sublayerTransform der übergeordneten / gemeinsamen Vorfahrenebene festzulegen:

%Vor%

(Es kann Wege geben, dies mit Ansichten statt Schichten zu machen; ich bin ein Mac-Typ, also kenne ich UIView nicht sehr tief.)

    
Peter Hosey 27.01.2014 20:22
quelle