2016-04-29 126 views
4

旋转UIImage我使用了一个从互联网上下载的扩展。在那里,旋转工作,但有一些有线行为。旋转UIImage问题 - IOS/Swift

这是扩展码

import UIKit 

extension UIImage { 

    public func imageRotatedByDegrees(degrees: CGFloat, flip: Bool) -> UIImage { 

     let radiansToDegrees: (CGFloat) -> CGFloat = { 
      return $0 * (180.0/CGFloat(M_PI)); 
     } 
     let degreesToRadians: (CGFloat) -> CGFloat = { 
      return $0/180.0 * CGFloat(M_PI); 
     } 

     // calculate the size of the rotated view's containing box for our drawing space 
     let rotatedViewBox = UIView(frame: CGRect(origin: CGPointZero, size: size)); 
     let t = CGAffineTransformMakeRotation(degreesToRadians(degrees)); 
     rotatedViewBox.transform = t; 
     let rotatedSize = rotatedViewBox.frame.size 

     // Create the bitmap context 
     UIGraphicsBeginImageContext(rotatedSize); 
     let bitmap = UIGraphicsGetCurrentContext(); 

     // Move the origin to the middle of the image so we will rotate and scale around the center. 
     CGContextTranslateCTM(bitmap, rotatedSize.width/2.0, rotatedSize.height/2.0); 

     // Rotate the image context 
     CGContextRotateCTM(bitmap, degreesToRadians(degrees)); 

     // Now, draw the rotated/scaled image into the context 
     var yFlip: CGFloat; 

     if(flip){ 
      yFlip = CGFloat(-1.0); 
     } else { 
      yFlip = CGFloat(1.0); 
     } 

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

     let newImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     return newImage; 
    } 
} 

这是我如何调用扩展方法并设置返回图像输出到图像视图。图像视图的“contentMode”属性设置为“缩放以填充”

currentPagePreviewImageVew.image = currentPagePreviewImageVew.image!.imageRotatedByDegrees(90, flip: false); 

这是它按下旋转按钮之前的外观

enter image description here

这是一次按下旋转按钮后(见图片不旋转,但它的规模已经改变)

enter image description here

这是当图像R浮选是90度。(图像旋转这里之后,但如可以看到其它视图得到拉伸时图像是在0和180度如在上述屏幕(2))

enter image description here

可以将某些一个请告诉我我的代码有什么问题,如果有更好的解决方案,请告诉我。任何帮助将不胜感激。

编辑:拉伸视图是由于约束问题。我通过将高度约束放置在imageview上方的工具栏来解决问题。但仍然无法找到第一次的答案。

+0

我有一个问题,因为改变仿射变换矩阵对自动布局约束有影响,这可能是一个类似的问题 – Daniel

+0

@simpleBob你做了什么工作来完成工作? – GMHSJ

+0

我删除并再次在对象上设置约束 – Daniel

回答

0

我用下面的扩展,它工作得很好。实际上这是swift 3

import UIKit 

extension UIImage { 

    public func rotateImageByDegrees(_ degrees: CGFloat) -> UIImage { 

     let degreesToRadians: (CGFloat) -> CGFloat = { 
      return $0/180.0 * CGFloat(M_PI) 
     } 

     // calculate the size of the rotated view's containing box for our drawing space 
     let rotatedViewBox = UIView(frame: CGRect(origin: CGPoint.zero, size: self.size)) 
     let t = CGAffineTransform(rotationAngle: degreesToRadians(degrees)); 
     rotatedViewBox.transform = t 
     let rotatedSize = rotatedViewBox.frame.size 

     // Create the bitmap context 
     UIGraphicsBeginImageContext(rotatedSize) 
     let bitmap = UIGraphicsGetCurrentContext() 

     // Move the origin to the middle of the image so we will rotate and scale around the center. 
     bitmap?.translateBy(x: rotatedSize.width/2.0, y: rotatedSize.height/2.0); 

     // Rotate the image context 
     bitmap?.rotate(by: degreesToRadians(degrees)); 

     // Now, draw the rotated/scaled image into the context 
     bitmap?.scaleBy(x: 1.0, y: -1.0) 
     bitmap?.draw(self.cgImage!, in: CGRect(x: -self.size.width/2, y: -self.size.height/2, width: self.size.width, height: self.size.height)) 

     let cgimage:CGImage = bitmap!.makeImage()! 
     return UIImage(cgImage: cgimage) 
    } 
} 

其他所有问题都与问题中相同。

+0

@LiborZapletal试试看。它为我工作 – GMHSJ

+0

感谢您的更新。我之前尝试过类似的方法,但对此没有帮助。它看起来像当我尝试旋转风景照片比它工作正常(即使我旋转照片到肖像和再次风景),但如果我把照片作为肖像,并尝试旋转 - >第一轮旋转变形图像和其他旋转工作正常,但旋转与deformatted照片。 –

+0

我有uiimageview比我怎么使用它。? – MRizwan33

1

你必须尝试这个办法:

extension UIImage { 
    public func imageRotatedByDegrees(degrees: Double, flip: Bool) -> UIImage { 

     // calculate the size of the rotated view's containing box for our drawing space 
     let rotatedViewBox = UIView(frame: CGRect(origin: CGPointZero, size: size)) 
     let t = CGAffineTransformMakeRotation(CGFloat(toRadian(degrees))) 
     rotatedViewBox.transform = t 
     let rotatedSize = rotatedViewBox.frame.size 

     // Create the bitmap context 
     UIGraphicsBeginImageContext(rotatedSize) 
     let bitmap = UIGraphicsGetCurrentContext() 

     CGContextSetAllowsAntialiasing(bitmap, true) 
     CGContextSetShouldAntialias(bitmap, true) 
     CGContextSetInterpolationQuality(bitmap, CGInterpolationQuality.High) 

     // Move the origin to the middle of the image so we will rotate and scale around the center. 
     CGContextTranslateCTM(bitmap, rotatedSize.width/2.0, rotatedSize.height/2.0) 

     // // Rotate the image context 
     CGContextRotateCTM(bitmap, CGFloat(toRadian(degrees))) 

     // Now, draw the rotated/scaled image into the context 
     var yFlip: CGFloat 

     if(flip){ 
      yFlip = CGFloat(-1.0) 
     } else { 
      yFlip = CGFloat(1.0) 
     } 

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

     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return newImage 
    } 

然后用这个方法来满足您的新的大小:

extension UIImage { 
    public func resizeImage(newSize:CGSize) -> UIImage { 

     let newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)) 
     let imageRef:CGImageRef = self.CGImage! 

     UIGraphicsBeginImageContextWithOptions(newSize, false, 0) 
     let context:CGContextRef = UIGraphicsGetCurrentContext()! 

     // Set the quality level to use when rescaling 
     CGContextSetInterpolationQuality(context, CGInterpolationQuality.High) 
     CGContextSetAllowsAntialiasing(context, true) 
     CGContextSetShouldAntialias(context, true) 

     let flipVertical:CGAffineTransform = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height) 

     CGContextConcatCTM(context, flipVertical) 
     // Draw into the context; this scales the image 
     CGContextDrawImage(context, newRect, imageRef) 

     // Get the resized image from the context and a UIImage 
     let newImage:UIImage = UIImage(CGImage: CGBitmapContextCreateImage(context)!) 

     UIGraphicsEndImageContext(); 
     return newImage 
    } 
} 
+0

感谢您帮助兄弟。但是这并没有解决我的问题。 – GMHSJ

4
func flipImageVertical(originalImage: UIImage) -> UIImage 
    { 
     let tempImageView:UIImageView = UIImageView(image: originalImage) 
     UIGraphicsBeginImageContext(tempImageView.frame.size) 
     let context:CGContextRef = UIGraphicsGetCurrentContext()! 
     let flipVertical:CGAffineTransform = CGAffineTransformMake(1,0,0,-1,0,tempImageView.frame.size.height) 
     CGContextConcatCTM(context, flipVertical) 
     tempImageView.layer .renderInContext(context) 

     let flippedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return flippedImage 
    } 

    func flipImageHorizontal(originalImage: UIImage) -> UIImage 
    { 
     let tempImageView:UIImageView = UIImageView(image: originalImage) 
     UIGraphicsBeginImageContext(tempImageView.frame.size) 
     let context:CGContextRef = UIGraphicsGetCurrentContext()! 
     let flipHorizontal:CGAffineTransform = CGAffineTransformMake(-1,0,0,1,tempImageView.frame.size.width,0) 

     CGContextConcatCTM(context, flipHorizontal) 
     tempImageView.layer .renderInContext(context) 

     let flippedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return flippedImage 
    } 
+0

你的两个方法工作正常。但这不是我想要的。我想旋转图像。不翻脸 – GMHSJ