2017-06-07 1 views
4

Benutzer laden ein Bild beliebiger Größe hoch, und wir müssen die Größe ändern, damit es zu einem Quadrat wird, ohne das Bild zu verzerren oder zu beschneiden. Im Grunde sollte es etwas ähnlich dem Inhaltsmodus "Aspect Fit" in einer Bildansicht tun. Also, wenn wir ein 200x100px png Bild haben, möchte ich es 200x200px machen und die zusätzlichen 100px in der Höhe transparenter Raum haben. Es sollte das Bild nicht auf 200x200 beschneiden.Bildgröße ändern, ohne es zu verzerren oder zu beschneiden

Ich habe versucht, diesen Bildprozessor zu verwenden, aber es tut nicht was ich will. https://github.com/gavinbunney/Toucan. Es schneidet nur das Bild ab.

Wie würde ich dies in swift tun und gibt es einen Rahmen, der besser ist als der, den ich oben erwähnt habe, um es einfacher zu machen. Grundsätzlich suche ich nach dem einfachsten Weg, dies zu tun.

+0

Möchten Sie wirklich das Bild selbst ändern? Oder ändern Sie einfach die Art, wie es angezeigt wird? – DonMag

+0

Wir müssen das Bild selbst ändern. Nicht nur die Darstellung ändern. Wir laden es auf unseren Server hoch und es muss im modifizierten Format hochgeladen werden. –

+1

https://gist.github.com/tomasbasham/10533743 - Scrollen Sie nach unten zum Kommentar-Header: 'Oyvindkg kommentierte am 4. Februar – DonMag

Antwort

0

Posting dies als eine Antwort, zusammen mit Beispiel für die Verwendung ...

Der Skalierungs Code ist nicht mein, es ist aus: https://gist.github.com/tomasbasham/10533743#gistcomment-1988471

Hier Code ist, dass Sie auf einem Spielplatz zu Test laufen können:

import UIKit 
import PlaygroundSupport 

let container = UIView(frame: CGRect(x: 0, y: 0, width: 800, height: 800)) 

container.backgroundColor = UIColor.blue 

PlaygroundPage.current.liveView = container 


// MARK: - Image Scaling. 
extension UIImage { 

    /// Represents a scaling mode 
    enum ScalingMode { 
     case aspectFill 
     case aspectFit 

     /// Calculates the aspect ratio between two sizes 
     /// 
     /// - parameters: 
     ///  - size:  the first size used to calculate the ratio 
     ///  - otherSize: the second size used to calculate the ratio 
     /// 
     /// - return: the aspect ratio between the two sizes 
     func aspectRatio(between size: CGSize, and otherSize: CGSize) -> CGFloat { 
      let aspectWidth = size.width/otherSize.width 
      let aspectHeight = size.height/otherSize.height 

      switch self { 
      case .aspectFill: 
       return max(aspectWidth, aspectHeight) 
      case .aspectFit: 
       return min(aspectWidth, aspectHeight) 
      } 
     } 
    } 

    /// Scales an image to fit within a bounds with a size governed by the passed size. Also keeps the aspect ratio. 
    /// 
    /// - parameter: 
    ///  - newSize:  the size of the bounds the image must fit within. 
    ///  - scalingMode: the desired scaling mode 
    /// 
    /// - returns: a new scaled image. 
    func scaled(to newSize: CGSize, scalingMode: UIImage.ScalingMode = .aspectFill) -> UIImage { 

     let aspectRatio = scalingMode.aspectRatio(between: newSize, and: size) 

     /* Build the rectangle representing the area to be drawn */ 
     var scaledImageRect = CGRect.zero 

     scaledImageRect.size.width = size.width * aspectRatio 
     scaledImageRect.size.height = size.height * aspectRatio 
     scaledImageRect.origin.x = (newSize.width - size.width * aspectRatio)/2.0 
     scaledImageRect.origin.y = (newSize.height - size.height * aspectRatio)/2.0 

     /* Draw and retrieve the scaled image */ 
     UIGraphicsBeginImageContext(newSize) 

     draw(in: scaledImageRect) 
     let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 

     UIGraphicsEndImageContext() 

     return scaledImage! 
    } 
} 

if let srcimg = UIImage(named: "flags") { 

    let w = srcimg.size.width 
    let h = srcimg.size.height 

    // determine whether width or height is greater 
    let longer = max(w, h) 

    // create a Square size 
    let sz = CGSize(width: longer, height: longer) 

    // call scaling function to scale the image to the Square dimensions, 
    // using "aspect fit" 
    let newImage = srcimg.scaled(to: sz, scalingMode: .aspectFit) 

    // create a UIImageView with the resulting image 
    let v = UIImageView(image: newImage) 
    v.backgroundColor = UIColor.white 

    // add it to the container view 
    container.addSubview(v) 

} 
Verwandte Themen