2010-05-18 21 views
15

İçinde bir görüntü bulunan bir UIImageView var. UIImageView ile CGAffineTransformMakeRotation (açı) 'nın dönüş açısını radyan cinsinden açı olarak ayarlayarak görüntülemeden önce görüntüyü döndürdüm.Döndürülmüş bir UIImageView'dan UIImage oluşturma

Görünümümde görebildiğim döndürülen sürüme karşılık gelen başka bir UIImage oluşturmak istiyorum. Görüntü merkezi etrafında

- (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; 
} 

döndürülmüş değildir Ancak: Resim bağlamı çevirerek, neredeyse oradayım

Ben döndürülen resmi olsun. Merkezim etrafında dönmesini sağlamak için döndürme ile birleştirilmiş her türlü dönüşümü denedim ama boşuna. Bir numara eksik mi? Bu, görüntüyü değil bağlamı döndürdüğümden beri mümkün mü?

Şimdi bu işi yapmak için çaresiz olmak, böylece herhangi bir yardım takdir edilecektir.

Dave

DÜZENLEME: Öyle işte burada, benim boundingRect kodu için birkaç kez istendi:

- (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

bu 'getBoundingRectAfterRotation' işlevi nedir? – bmdhacks

+0

Merhaba bmdhacks getBoundingRectAfterRotation oluşturduğum bir yöntemdir, bu yüzden herhangi bir Cocoa-Touch sınıfında bulamıyorsunuz. Argümanlar olarak bir doğrultu ve açıyı alır ve verilen açı tarafından döndürüldüğünde orijinal rect'i kapsayacak yeni bir CGRect döndürür. –

+0

Merhaba popüler talepten dolayı bmdhacks, orijinal sorgunun bir düzenlemesinde yöntemi ekledi. –

cevap

22

Tamam - Son azından ben bunu yapmış gibi görünüyor. Doğruluk hakkında herhangi bir yorum yararlı olacaktır ... çalışmak için bir çeviri, bir döndürme, bir ölçek ve çizim rect pozisyonundan bir ofset gerekli. Kod burada:

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

Neden "dönüşümü = CGAffineTransformScale (dönüştürme, 1.0, -1.0)"; ? – Hlung

+3

CoreGraphics, kökenin sol altta olduğu bir koordinat sistemi kullanır. UIKit nesneleri, ekranın aşağı doğru hareket ederken y ekseni ile sol üstteki bir menüyü kullanır. Bu dönüştürme, görüntünün doğru şekilde çizildiğinden emin olmak için y eksenini çevirir. –

+1

Teşekkürler! Çevirme, döndürme ve ölçekleme ile bağlamda görüntü çizme konusunda mücadele ediyordum. UIImage'ın drawInRect: 'ini denedim ve içeriği çevirdim ama her zaman sol üstte dönüyor (0,0). Çözümünüz işe yarayan tek şey! :) – Hlung