2010-05-18 8 views
15

Ich habe ein UIImageView mit einem Bild darin. Ich habe das Bild vor der Anzeige gedreht, indem ich die Transform-Eigenschaft von UIImageView auf CGAffineTransformMakeRotation (Winkel) gesetzt habe, wobei Winkel der Winkel im Bogenmaß ist.Erstellen eines UIImage aus einem gedrehten UIImageView

Ich möchte in der Lage sein, eine andere UIImage zu erstellen, die der gedrehten Version entspricht, die ich in meiner Ansicht sehen kann.

ich fast da bin, indem Sie das Bild Kontext Dreh bekomme ich ein gedrehtes Bild:

- (UIImage *) rotatedImageFromImageView: (UIImageView *) imageView 
{ 
    UIImage *rotatedImage; 

    // Get image width, height of the bounding rectangle 
    CGRect boundingRect = [self getBoundingRectAfterRotation: imageView.bounds byAngle:angle]; 

    // Create a graphics context the size of the bounding rectangle 
    UIGraphicsBeginImageContext(boundingRect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Rotate and translate the context 
    CGAffineTransform ourTransform = CGAffineTransformIdentity; 
    ourTransform = CGAffineTransformConcat(ourTransform, CGAffineTransformMakeRotation(angle)); 

    CGContextConcatCTM(context, ourTransform); 

    // Draw the image into the context 
    CGContextDrawImage(context, CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height), imageView.image.CGImage); 

    // Get an image from the context 
    rotatedImage = [UIImage imageWithCGImage: CGBitmapContextCreateImage(context)]; 

    // Clean up 
    UIGraphicsEndImageContext(); 
    return rotatedImage; 
} 

jedoch das Bild nicht um seine Mitte gedreht wird. Ich habe alle Arten von Transformationen versucht, die mit meiner Rotation verkettet sind, um sie um die Mitte rotieren zu lassen, aber ohne Erfolg. Vermisse ich einen Trick? Ist das überhaupt möglich, da ich den Kontext und nicht das Bild rotiere?

Immer verzweifelt, um dies jetzt zu arbeiten, so würde jede Hilfe geschätzt werden.

Dave

EDIT: Ich habe mehrmals für meine boundingRect Code gefragt worden, so ist es hier:

- (CGRect) getBoundingRectAfterRotation: (CGRect) rectangle byAngle: (CGFloat) angleOfRotation { 
    // Calculate the width and height of the bounding rectangle using basic trig 
    CGFloat newWidth = rectangle.size.width * fabs(cosf(angleOfRotation)) + rectangle.size.height * fabs(sinf(angleOfRotation)); 
    CGFloat newHeight = rectangle.size.height * fabs(cosf(angleOfRotation)) + rectangle.size.width * fabs(sinf(angleOfRotation)); 

    // Calculate the position of the origin 
    CGFloat newX = rectangle.origin.x + ((rectangle.size.width - newWidth)/2); 
    CGFloat newY = rectangle.origin.y + ((rectangle.size.height - newHeight)/2); 

    // Return the rectangle 
    return CGRectMake(newX, newY, newWidth, newHeight); 
} 
+0

Was ist das 'getBoundingRectAfterRotation' Funktion? – bmdhacks

+0

Hallo @bmdhacks die getBoundingRectAfterRotation ist eine Methode, die ich erstellt habe, so dass Sie es in keiner der Cocoa-Touch-Klassen finden. Es nimmt ein rect und einen angle als Argumente und gibt ein neues CGRect zurück, das das ursprüngliche rect einschließen würde, wenn es um den gegebenen Winkel gedreht würde. –

+0

Hallo @bmdhacks aufgrund der großen Nachfrage haben die Methode in einer Bearbeitung zu meiner ursprünglichen Frage hinzugefügt. –

Antwort

22

OK - endlich scheinen ich es getan zu haben. Irgendwelche Kommentare zur Korrektheit wären nützlich ... benötigten eine Übersetzung, eine Drehung, eine Skalierung und einen Versatz von der Zeichnungsrechteckposition, um es zu arbeiten. Code ist hier:

CGAffineTransform transform = CGAffineTransformIdentity; 
transform = CGAffineTransformTranslate(transform, boundingRect.size.width/2, boundingRect.size.height/2); 
transform = CGAffineTransformRotate(transform, angle); 
transform = CGAffineTransformScale(transform, 1.0, -1.0); 

CGContextConcatCTM(context, transform); 

// Draw the image into the context 
CGContextDrawImage(context, CGRectMake(-imageView.image.size.width/2, -imageView.image.size.height/2, imageView.image.size.width, imageView.image.size.height), imageView.image.CGImage); 

// Get an image from the context 
rotatedImage = [UIImage imageWithCGImage: CGBitmapContextCreateImage(context)]; 
+1

warum brauchen Sie 'transform = CGAffineTransformScale (Transform, 1.0, -1.0);' ? – Hlung

+3

Die CoreGraphics verwendet ein Koordinatensystem, bei dem der Ursprung links unten ist. UIKit-Objekte verwenden einen Ursprung oben links, wobei die y-Achse zunimmt, wenn Sie den Bildschirm nach unten bewegen. Diese Transformation dreht die Y-Achse um, um sicherzustellen, dass das Bild richtig nach oben gezeichnet wird. –

+1

Danke! Ich hatte Probleme, mit Context, Rotation und Skalierung ein Bild im Kontext zu zeichnen. Ich habe versucht, UIImage 'drawInRect:' und den Kontext zu übersetzen, aber es dreht sich immer um links oben (0,0). Ihre Lösung ist die einzige, die funktioniert! :) – Hlung

Verwandte Themen