Cropping image with Swift and put it on center position

后端 未结 14 1181
心在旅途
心在旅途 2020-12-01 00:32

In Swift programming , how do you crop an image and put it on the center afterwards?

This is what I\'ve got so far ... I\'ve successfully crop the image but I want t

14条回答
  •  没有蜡笔的小新
    2020-12-01 01:17

    The accepted answer only does squares for me. I needed a bit more flexible cropping mechanism so I wrote an extension as follows:

    import UIKit

    extension UIImage {
    
    func crop(to:CGSize) -> UIImage {
    
        guard let cgimage = self.cgImage else { return self }
    
        let contextImage: UIImage = UIImage(cgImage: cgimage)
    
        guard let newCgImage = contextImage.cgImage else { return self }
    
        let contextSize: CGSize = contextImage.size
    
        //Set to square
        var posX: CGFloat = 0.0
        var posY: CGFloat = 0.0
        let cropAspect: CGFloat = to.width / to.height
    
        var cropWidth: CGFloat = to.width
        var cropHeight: CGFloat = to.height
    
        if to.width > to.height { //Landscape
            cropWidth = contextSize.width
            cropHeight = contextSize.width / cropAspect
            posY = (contextSize.height - cropHeight) / 2
        } else if to.width < to.height { //Portrait
            cropHeight = contextSize.height
            cropWidth = contextSize.height * cropAspect
            posX = (contextSize.width - cropWidth) / 2
        } else { //Square
            if contextSize.width >= contextSize.height { //Square on landscape (or square)
                cropHeight = contextSize.height
                cropWidth = contextSize.height * cropAspect
                posX = (contextSize.width - cropWidth) / 2
            }else{ //Square on portrait
                cropWidth = contextSize.width
                cropHeight = contextSize.width / cropAspect
                posY = (contextSize.height - cropHeight) / 2
            }
        }
    
        let rect: CGRect = CGRect(x: posX, y: posY, width: cropWidth, height: cropHeight)
    
        // Create bitmap image from context using the rect
        guard let imageRef: CGImage = newCgImage.cropping(to: rect) else { return self}
    
        // Create a new image based on the imageRef and rotate back to the original orientation
        let cropped: UIImage = UIImage(cgImage: imageRef, scale: self.scale, orientation: self.imageOrientation)
    
        UIGraphicsBeginImageContextWithOptions(to, false, self.scale)
        cropped.draw(in: CGRect(x: 0, y: 0, width: to.width, height: to.height))
        let resized = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        return resized ?? self
      }
    }
    

    You can use it so:

    let size = CGSize(width: 300, height: 200)
    let image = UIImage(named: "my_great_photo")?.crop(size)
    

    If anyone has ideas how to make the landscape, portrait and square handling a bit better let me know.

提交回复
热议问题