2016-04-19 11 views
0

ich verschiedene Bilder mit diesem func bin Ändern der Größe:Qualität der UIImage

func resizeImage(image: UIImage) -> UIImage { 
     var actualHeight: CGFloat = image.size.height 
     var actualWidth: CGFloat = image.size.width 

     let maxHeight: CGFloat = 600.0 
     let maxWidth: CGFloat = text.frame.size.width - 10 

     var imgRatio: CGFloat = actualWidth/actualHeight 
     let maxRatio: CGFloat = maxWidth/maxHeight 
     let compressionQuality: CGFloat = 0.5 
     //50 percent compression 
     if actualHeight > maxHeight || actualWidth > maxWidth { 
      if imgRatio < maxRatio { 
       //adjust width according to maxHeight 
       imgRatio = maxHeight/actualHeight 
       actualWidth = imgRatio * actualWidth 
       actualHeight = maxHeight 
      } 
      else if imgRatio > maxRatio { 
       //adjust height according to maxWidth 
       imgRatio = maxWidth/actualWidth 
       actualHeight = imgRatio * actualHeight 
       actualWidth = maxWidth 
      } 
      else { 
       actualHeight = maxHeight 
       actualWidth = maxWidth 
      } 
     } 
     let rect: CGRect = CGRectMake(0.0, 0.0, actualWidth, actualHeight) 
     UIGraphicsBeginImageContext(rect.size) 
     image.drawInRect(rect) 
     let img: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     let imageData: NSData = UIImageJPEGRepresentation(img, compressionQuality)! 
     UIGraphicsEndImageContext() 

     return UIImage(data: imageData)! 
    } 

Aber die Qualität ist einfach schrecklich .... Heres ein Bild von dem, was ich unten:

enter image description here

Ich dachte, dass die Qualität des Bildes davon abwich, was die Komprimierungsqualität war ...? Ich habe es jetzt bei 0,5, wie Sie aus meinem Code oben sehen können, aber selbst wenn ich es auf 1 ändere, ist die Qualität immer noch schrecklich?

Irgendwelche Ideen,

Vielen Dank.

+0

0,5 Kompressionsverhältnis in der Originalgröße passt scheint ein Unschärfe-Effekt zu sein? – zcui93

+0

@ zcui93 nicht sicher, ich verstehe, was du meinst –

+0

Ihr Code scheint in Ordnung zu sein. Können Sie der Frage originale und modifizierte Versionen desselben Bildes hinzufügen? – Avt

Antwort

2

Sie sollten stattdessen verwenden. Es wird die korrekte Skalierung für Ihr Gerät verwendet. Die von Ihnen verwendete Version (ohne Optionen) verwendet einen Standardskalierungsfaktor von 1.0. Wenn Sie die ...WithOptions() Variante verwenden und 0.0 für die Waage übergeben, wird standardmäßig die native Skalierung des Geräts verwendet. Beachten Sie, dass dies möglicherweise nicht das ist, was Sie möchten.

Zweitens können Sie AVMakeRectWithAspectRatioInsideRect() verwenden, um Ihre Zielgröße zu berechnen. Drittens müssen Sie die JPEG-Codierung nicht durchlaufen, Sie können das generierte Bild direkt zurückgeben.

Kombination, dies vereinfacht die Code:

func resizeImage(image: UIImage) -> UIImage { 
    let maxSize = CGSize(
    width: text.frame.size.width - 10, 
    height: 600.0 
) 
    let newSize = AVMakeRectWithAspectRatioInsideRect(
    image.size, 
    CGRect(origin: CGPointZero, size: maxSize) 
).size 
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) 
    image.drawInRect(CGRect(origin: CGPointZero, size: newSize)) 
    let scaled = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return scaled 
} 

EDIT: Dies ist eine Erweiterung auf UIImage, die ich in einem Projekt verwenden:

extension UIImage { 
    /** 
    Returns an scaled version of self that fits within the provided bounding box. 
    It retains aspect ratio, and also retains the rendering mode. 
    - parameter size: The target size, in point 
    - parameter scale: Optional target scale. If omitted, uses the scale of input image 
    - returns: A scaled image 
    */ 
    func imageFittingSize(size: CGSize, scale: CGFloat? = nil) -> UIImage { 
     let newSize = AVMakeRectWithAspectRatioInsideRect(self.size, CGRect(origin: CGPointZero, size: size)).size 
     UIGraphicsBeginImageContextWithOptions(newSize, false, scale ?? self.scale) 
     self.drawInRect(CGRect(origin: CGPointZero, size: newSize)) 
     let scaled = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return scaled.imageWithRenderingMode(renderingMode) 
    } 
} 

Sie können es auf ein Bild aufrufen wie so :

let maxSize = CGSize(width: text.frame.size.width - 10, height: 600.0) 
let scaled = image.imageFittingSize(maxSize) 
+0

Hallo Danke dafür, ich vermute ich muss das AVFoundation Framework installieren? –

+0

Nein, es ist im iOS SDK enthalten, aber Sie müssen es am Anfang Ihrer Datei importieren. –

+0

Qualität sieht gut aus, aber nicht die richtige Größe ... http: //i.stack.imgur.com/pIjNW.png –