2011-08-25 12 views

Odpowiedz

15

Można obracać obraz za pomocą następującego kodu. Uwaga ta wykorzystuje CGImageRef które można uzyskać z UIImage poprzez

CGImageRef imageRef = [self CGImageRotatedByAngle:[image CGImage] angle:30]; 

Po uzyskaniu obróconego obrazu można ustawić wizerunku ImageView do nowego obróconego obrazu jak ta:

UIImage* img = [UIImage imageWithCGImage: imageRef]; 
myImageView.image = img; 

tutaj jest to metoda, która będzie obracać imageRef:

- (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle 
{ 

    CGFloat angleInRadians = angle * (M_PI/180); 
    CGFloat width = CGImageGetWidth(imgRef); 
    CGFloat height = CGImageGetHeight(imgRef); 

    CGRect imgRect = CGRectMake(0, 0, width, height); 
    CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); 
    CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef bmContext = CGBitmapContextCreate(NULL, 
                rotatedRect.size.width, 
                rotatedRect.size.height, 
                8, 
                0, 
                colorSpace, 
                kCGImageAlphaPremultipliedFirst); 
    CGContextSetAllowsAntialiasing(bmContext, YES); 
    CGContextSetShouldAntialias(bmContext, YES); 
    CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh); 
    CGColorSpaceRelease(colorSpace); 
    CGContextTranslateCTM(bmContext, 
          +(rotatedRect.size.width/2), 
          +(rotatedRect.size.height/2)); 
    CGContextRotateCTM(bmContext, angleInRadians); 
    CGContextTranslateCTM(bmContext, 
          -(rotatedRect.size.width/2), 
          -(rotatedRect.size.height/2)); 
    CGContextDrawImage(bmContext, CGRectMake(0, 0, 
              rotatedRect.size.width, 
              rotatedRect.size.height), 
         imgRef); 



    CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); 
    CFRelease(bmContext); 
    [(id)rotatedImage autorelease]; 

    return rotatedImage; 
} 
+0

podziękowaniem ty. Dokładnie tego chcę. – murzynpl

+1

Ktoś może napotkać nieprzewidywalny rezultat, tak jak ostatnio - ostateczny obraz tracił swój pierwotny rozmiar i przycięte rogi. Więc trochę zmodyfikowałem funkcję, by uzyskać poprawny wynik. Jeśli ktoś zastanawia się, czy moje rozwiązanie jest tutaj: http://stackoverflow.com/questions/19219855/uiimageview-get-transformed-uiimage/19221081#19221081 – heximal

+0

Po obrocie rozmiar obrazu zmieni się zgodnie z poprzednim komentatorem. W powyższym kodzie występuje niewielki błąd. Ostatnie wywołanie CGContextTranslateCTM i CGContextDrawImage powinno używać oryginalnej szerokości i wysokości zamiast roundedRect.size.width i rounded.size.height. Gdy to zrobisz, powyższy kod działa doskonale. Powód - tworzony jest ctxt z obracanym prostokątem, początek jest przesuwany do środka, a następnie odwrotnie obracany, aby dopasować oryginalną orientację obrazu. W tym momencie musisz przenieść go z powrotem do układu współrzędnych oryginalnego obrazu. – matangs

6

Spójrz na obracanie warstwy ImageView. Będziesz musiał zaimportować bibliotekę QuartzCore, aby była dostępna.

myImageView.layer.transform = CGAffineTransformMakeRotation (1.5); 
+1

musiał używać 'setAffineTransform' – fabian789

5

Spróbuj tego, że pracuje dla mnie:

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
[UIView setAnimationRepeatCount:10]; 
myImgView.transform = CGAffineTransformMakeRotation(M_PI); 
[UIView commitAnimations]; 

Powodzenia!

1

następujący kod działa poprawnie z Swift:

let img = UIImage(CGImage: self.imageView.image!.CGImage, scale: 1.0, orientation: UIImageOrientation.Right) 
self.imageView.image = img 
self.imageView.setNeedsLayout() 
0

Jeśli trzeba obracać/przerzucać obraz do celów lokalizacyjnych można użyć następujących: imageView.image = imageView.image?.imageFlippedForRightToLeftLayoutDirection()