2013-07-28 40 views
4

我有一個包含圖像的UIImageView。當時用戶可以點擊將UIImageView中的圖像保存到磁盤。如何將UIImage和圖像數據旋轉90度

我想讓用戶可以點擊旋轉UIImageView,並在視圖中旋轉UImage,以便在保存圖像時保持新的旋轉。

在分鐘我就要

- (IBAction)rotateImage:(id)sender { 

float degrees = 90; //the value in degrees 
self.imagePreview.transform = CGAffineTransformMakeRotation(degrees * M_PI/180); 

} 

有人能指出我在關於保持當前的旋轉方向是正確的。

感謝

+0

如果你希望旋轉在圖像保存後保留,你應該旋轉UIImage,而不是UIImageView。 –

+0

[如何旋轉UIImage]的可能的重複(http://stackoverflow.com/questions/14857728/how-to-rotate-uiimage) – Suma

回答

-1

self.imageview.transform = CGAffineTransformMakeRotation(M_PI/2);

+0

這相當於OP已經看到的90 * pi/180是等於M_PI/2。 –

+0

或者'M_PI_2'常數 –

+0

這不會自動旋轉圖像數據 – kompozer

8

我在舊的應用程序這樣的代碼。但是這個代碼可以簡化,因爲你不需要在非90度的角度上旋轉它。

- (UIImage *)rotateImage:(UIImage *)image onDegrees:(float)degrees 
{ 
    CGFloat rads = M_PI * degrees/180; 
    float newSide = MAX([image size].width, [image size].height); 
    CGSize size = CGSizeMake(newSide, newSide); 
    UIGraphicsBeginImageContext(size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(ctx, newSide/2, newSide/2); 
    CGContextRotateCTM(ctx, rads); 
    CGContextDrawImage(UIGraphicsGetCurrentContext(),CGRectMake(-[image size].width/2,-[image size].height/2,size.width, size.height),image.CGImage); 
    UIImage *i = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return i; 
} 
+3

爲什麼這樣切換圖像方向? – Esqarrouth

+0

對於180度,這翻轉圖像。 – Nate

+0

@Nate它不是相同的旋轉180度(顛倒),而不是翻轉它(正面背面)。 – maganap

5

這將旋轉任何給定弧度的圖像。

注意這個工程2x和3倍視網膜以及

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees { 
    CGFloat radians = DegreesToRadians(degrees); 

    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.size.width, self.size.height)]; 
    CGAffineTransform t = CGAffineTransformMakeRotation(radians); 
    rotatedViewBox.transform = t; 
    CGSize rotatedSize = rotatedViewBox.frame.size; 

    UIGraphicsBeginImageContextWithOptions(rotatedSize, NO, [[UIScreen mainScreen] scale]); 
    CGContextRef bitmap = UIGraphicsGetCurrentContext(); 

    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); 

    CGContextRotateCTM(bitmap, radians); 

    CGContextScaleCTM(bitmap, 1.0, -1.0); 
    CGContextDrawImage(bitmap, CGRectMake(-self.size.width/2, -self.size.height/2 , self.size.width, self.size.height), self.CGImage); 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 
+1

這個效果很好,但是我用'CGFloat radians = degrees *(M_PI/180.0)'替換了'CGFloat radians = DegreesToRadians(度);''多了一個'包含'的解決方案 – mylogon

+0

有效的解決方案之一,+1,謝謝! – Vlad

1

一個UIButton的聚焦狀態並沒有走正常打開插入圖像的正確方向。所以我不得不重新繪製像@RyanG所展示的圖像。這裏是Swift 2.2的代碼:

extension UIImage 
{ 
    /// Rotate an image by any given radians. 
    /// Works for 2x and 3x retina as well. 
    func imageRotatedByDegrees(degrees: Double) -> UIImage 
    { 
     let radians = CGFloat(degrees * (M_PI/180.0)) 

     let rotatedViewBox = UIView(frame: CGRect(origin: CGPointZero, size: self.size)) 
     let t: CGAffineTransform = CGAffineTransformMakeRotation(radians) 
     rotatedViewBox.transform = t 
     let rotatedSize = rotatedViewBox.frame.size 

     UIGraphicsBeginImageContextWithOptions(rotatedSize, false, self.scale) 
     let bitmap = UIGraphicsGetCurrentContext() 

     CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2) 
     CGContextRotateCTM(bitmap, radians) 
     CGContextScaleCTM(bitmap, 1.0, -1.0) 
     CGContextDrawImage(bitmap, CGRect(origin: CGPoint(x: -self.size.width/2, y: -self.size.height/2), size: self.size), self.CGImage) 

     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return newImage 
    } 
}