Bild drehen mit CGContextDrawImage
Wie kann ich ein Bild drehen, gezeichnet von CGContextDrawImage()
im Zentrum?
In drawRect:
CGContextSaveGState(c);
rect = CGRectOffset(rect, -rect.size.width / 2, -rect.size.height / 2);
CGContextRotateCTM(c, angle);
CGContextDrawImage(c, rect, doodad.CGImage);
CGContextRotateCTM(c, -angle);
CGContextTranslateCTM(c, pt.x, pt.y);
prevRect = rect;
CGContextRestoreGState(c);
Ziehe ich das Bild auf den Ursprung, und drehen Sie Sie in Ihre Mitte, dann übersetzen, wo es gezeichnet werden soll. Funktioniert nicht.
- drehen kann man zentral das Bild anzeigen, indem Sie die Einstellung der Anker-Punkt
- Dies setzt Voraus, dass das Bild in einer Ansicht ganz von selbst (wie ein Bild-Ansicht), und dass die Fragesteller nicht beabsichtigt, speichern Sie das gedrehte Bild überall. (Wenn man es in einem Bild anzuzeigen und zu drehen, dass ist wohl die richtige Lösung, wenn die letztere Annahme wahr ist.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sache zu erinnern, über Koordinaten-Transformationen—gut, eine der Dinge zu erinnern—ist, dass Sie nicht manipulieren von Objekten, wie der Befehl "Transformieren" in einem Grafik-editor, die Sie Bearbeiten Raum selbst.
Vorstellen, dass das Gerät angehalten ist über eine Rezeption durch einen Schwanenhals arm und ist fest in position. Koordinaten-Transformationen bewegen Sie den Schreibtisch herum (übersetzung), und drehen Sie es die eine oder andere Weise (rotation), und sogar squash und stretch es (Skalierung).
Anderen die Dinge zu erinnern, über Koordinaten-Transformationen ist, dass die Umwandlung immer relativ zum Ursprung. Stell dir vor, dein Schreibtisch beginnt mit einer seiner Ecken, das entspricht einer Ecke der view—direkt unterhalb der Ecke, wo Ihr Blick landet auf dem Bildschirm. Die übersetzung bewegt sich die Ecke des Schreibtisches, und der rest von der Rezeption mit, schieben es die eine oder andere Weise unter dem Bildschirm. Drehen, dreht sich die Rezeption um die Ecke.
Eins noch: Transformationen betreffen die Zukunft, nicht die Vergangenheit. Zeichnen Sie etwas, und dann versuchen, es zu transformieren, es wird nicht funktionieren, weil Sie nicht verwandeln, was Sie gezeichnet haben, Sie verwandeln den Raum, die du ziehen wirst in. So, wir verschieben müssen, um dem Schreibtisch vor, können wir platzieren Sie das Bild an der richtigen Stelle.
(Ich erwähnen, dass Letzte Teil, weil Sie ein paar Transformations-Befehle, die sofort rückgängig gemacht, die durch Ihre
CGContextRestoreGState
nennen. Es ist keine Zeichnung, zwischen Ihnen zu beeinflussen.)Also, lasst uns beginnen mit dem, nicht gedrehte Rechteck des Bildes.
Nun
CGContextDrawImage
nimmt ein Rechteck, aber, wie Sie wissen, es geht um zeichnen das Bild aus der unteren linken Ecke des Rechtecks, nicht die Mitte. (Daher ist diese ganze übung.)So, hier ist was Sie tun werden. Am Ende dieser, die du ziehen wirst das Bild nicht an dieser Stelle oben gezeigt, aber am Nullpunkt—das ist auf der Ecke des Schreibtischs. (Nicht zentriert auf der Ecke, aber mit dem Bild der Ecke auf dem Schreibtisch-Ecke.)
Wie funktioniert das? Es dauert einige set-up. Sie gehen zu müssen, bewegen Sie Ihren Schreibtisch.
Erste, Sie brauchen, um zu bewegen, Ihren Schreibtisch bis und Recht, bis die Herkunft der Ecke von Ihrem Schreibtisch aus in der gewünschten Mittelpunkt:
Dann machst du die rotation (drehen Sie den Schreibtisch um seine Herkunft Ecke):
Dann wechseln Sie den Schreibtisch zurück unten und Links um die Hälfte des Bildes der Breite und der Höhe:
Und dann, endlich, legen Sie das Bild auf die Ecke des Schreibtischs.
Mit Ihrem Schreibtisch so verschoben, das Zentrum des Rechtecks liegt direkt unter dem Punkt auf den Bildschirm, wo Sie möchten, dass das Bild zentriert, so dass das Bild so zentriert.
CGContextTranslateCTM(c, rect.origin.x + rect.size.width * 0.5, rect.origin.y + rect.size.height * 0.5); CGContextRotateCTM(c, angle); CGContextDrawImage(c, (CGRect){CGPointZero, rect.size}, doodad.CGImage);
translate
als der Ursprung des Bildes Rechteck statt, in welchem Fall die Mitte des Bildes (dessen Herkunft hängt ab von der Rezeption) befindet sich auf der Ecke (Ursprung) des Schreibtischs.CGContextSaveGState
/CGContextRestoreGState
.pointWhereYouWantTheImageCentered
im obigen Beispiel muss die Größe nach der Transformation angewendet wird. Sie finden diese mitCGRect transformedRect = CGRectApplyAffineTransform(imageBounds, transform)
undCGPoint pointWhereYouWantTheImageCentered = CGPointMake(transformedRect.size.width / 2.0f, transformedRect.size.height / 2.0f)
Dieser Funktion zeichnen kann, Bild auf ein vorhandenes Bild mit Drehwinkel im Bogenmaß.
Swift 3:
Wenn Sie brauchen, um zu erstellen und leeres Bild mit der Größe und der Farbe, verwenden Sie:
Können Sie die folgende Methode verwenden, für rotierende Bild.
Wenn Sie Winkel, dann ist hier das makro für die Konvertierung von Grad nach radian
Wenn Sie letztlich Zeichnung auf dem Bildschirm (im Gegensatz zur Erzeugung eines Bildes in einer Datei speichern), sollten Sie erwägen, nicht mit einem CGContext, sondern setzen das Bild in einen CALayer und drehen Sie die Ebene um seinen Ankerpunkt:
Wenn das Bild selbst generiert (im Gegensatz zu einer statischen Ressource von Ihrem bundle oder so etwas enthalten), könnten Sie erwägen, es aus der Ebenen und Einstellung der
sublayerTransform
Eltern - /common-ancestor-Schicht:(Möglicherweise gibt es Möglichkeiten, dies zu tun mit Blick auf anstelle von Schichten; ich bin ein Mac-Typ, also weiß ich nicht, UIView sehr tief.)