2011-08-25 44 views

Trả lời

15

Bạn có thể xoay hình ảnh bằng mã sau. Lưu ý, đây sử dụng một CGImageRef mà bạn có thể nhận được từ một UIImage qua

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

Một khi bạn có được hình ảnh xoay, bạn có thể thiết lập hình ảnh của ImageView để hình ảnh xoay mới của bạn như thế này:

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

đây là một phương pháp mà sẽ xoay 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

Thank bạn. Đó là chính xác những gì tôi muốn. – murzynpl

+1

Một người nào đó có thể phải đối mặt với kết quả không thể đoán trước như tôi đã làm gần đây - hình ảnh cuối cùng bị mất kích thước ban đầu và các góc bị cắt. Vì vậy, tôi đã slighlty sửa đổi các chức năng để có được kết quả chính xác. Nếu ai đó tự hỏi giải pháp của tôi là ở đây: http://stackoverflow.com/questions/19219855/uiimageview-get-transformed-uiimage/19221081#19221081 – heximal

+0

Sau khi kích thước hình ảnh xoay sẽ thay đổi như bình luận trước đó đã đề cập. Có một lỗi nhỏ trong mã ở trên. Cuộc gọi cuối cùng với CGContextTranslateCTM và CGContextDrawImage nên sử dụng chiều rộng và chiều cao ban đầu thay vì roundRect.size.width và rounded.size.height. Một khi bạn làm điều đó, đoạn mã trên hoạt động hoàn hảo. Lý do - một ctxt với rect xoay được tạo ra, nguồn gốc được chuyển đến trung tâm, sau đó nó được xoay ngược để phù hợp với hướng hình ảnh gốc. Tại thời điểm này, bạn cần di chuyển nó trở lại trong hệ tọa độ của ảnh gốc. – matangs

6

Hãy xem xoay lớp ImageView. Bạn sẽ cần phải nhập thư viện QuartzCore để có thể truy cập được.

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

đã phải sử dụng 'setAffineTransform' – fabian789

5

Vui lòng thử này, nó hoạt động cho tôi:

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

Chúc bạn may mắn!

1

Các mã sau hoạt động tốt với Swift:

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

Nếu bạn cần phải xoay/lật hình ảnh cho mục đích nội địa hóa, bạn có thể sử dụng như sau: imageView.image = imageView.image?.imageFlippedForRightToLeftLayoutDirection()