2016-04-29 11 views
4

Zum Drehen eines UIImagage habe ich eine Erweiterung verwendet, die aus dem Internet heruntergeladen wird. Dort funktioniert das Drehen, aber es gibt einige verdrahtete Verhaltensweisen.Problem beim Drehen UIImage - IOS/Swift

Dies ist die Erweiterung Code

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

Dies ist, wie ich Erweiterungsmethode und zurückgegeben Bild, um die Fotoansicht aufrufen. Bild Ansicht der ‚contentMode‘ Eigenschaft wird auf ‚Scale Fill‘

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

Dies ist, wie es aussieht, bevor drehen Taste

enter image description here

einmal Dies ist nach dem Drücken dreht Taste drücken. (Siehe Bild nicht gedreht wird, aber es ist Größe geändert wurde)

enter image description here

Dies ist, wenn das Bild r otation beträgt 90 Grad. (hier nach dem Bild dreht aber wie man die anderen Ansichten zu sehen bekommen gedehnt, wenn Bild in 0 und 180 Grad, wie in dem obigen Bildschirm (2))

enter image description here

Kann jemand Bitte sagen Sie mir, was mit meinem Code nicht stimmt und wenn es eine bessere Lösung gibt, lassen Sie es mich bitte wissen. Jede Hilfe würde sehr geschätzt werden.

Bearbeitet: Das Ausdehnen der Ansichten war wegen eines Einschränkungsproblems. Ich habe es gelöst, indem ich eine Höhenbeschränkung auf die Werkzeugleiste über der Bildansicht gesetzt habe. Aber ich konnte immer noch keine Antwort für dieses erste Mal finden.

+0

Ich hatte ein Problem, weil die Änderung der affinen Transformationsmatrix einen Einfluss auf die automatischen Layout-Einschränkungen hatte. Dies könnte ein ähnliches Problem sein. – Daniel

+0

@simpleBob Was haben Sie getan, um Ihre Arbeit zu erledigen? – GMHSJ

+0

Ich entfernte und setze die Einschränkungen wieder auf das Objekt – Daniel

Antwort

0

ich unter Erweiterung verwendet und es funktionierte gut. Dies ist swift 3 tatsächlich.

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) 
    } 
} 

Alle anderen Dinge sind die gleichen wie in der Frage.

+0

@LiborZapletal Probieren Sie es aus. es funktionierte für mich – GMHSJ

+0

Danke für das Update. Ich habe vorher eine ähnliche Methode versucht und es hat nicht geholfen.Es sieht so aus, als würde ich Landschaftsfotos drehen, wenn es in Ordnung ist (selbst wenn ich Fotos in Hochformat und dann wieder in Querformat rotiere), aber wenn ich das Foto als Hochformat aufgenommen habe und versuche zu drehen -> die erste Drehung verformt das Bild und das andere Rotationen funktionieren einwandfrei, rotieren aber mit deformatiertem Foto. –

+0

ich habe uiimageview als wie kann ich es verwenden.? – MRizwan33

1

Sie müssen diese versuchen:

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 
    } 

Dann diese Methode verwenden Ihre neue Größe zu erfüllen:

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

Danke, dass du Bro geholfen hast. Aber das hat mein Problem nicht behoben. – 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

Ihre beiden Methoden funktionieren gut. Aber das ist nicht das, was ich wollte. Ich möchte das Bild drehen. nicht spiegeln – GMHSJ