裁剪UIImage到中心广场

时间:2017-06-08 13:23:13

标签: ios swift swift3 uiimage crop

我获得了1920x1080分辨率的图像。我试图将它们裁剪到中心广场区域(即中心的1080x1080平方)。该决议可能在未来发生变化。是否可以通过这种方式裁剪图像?我已尝试在SO上发布了一些东西,但如果我尝试裁剪然后居中,我总会得到660x1080的图像。这是描绘我想要实现的目标的图像。 pic

基本上红色是原始的,绿色是我想要的,黄色只是显示mixX和midY线。

我试过的代码。

func imageByCroppingImage(image: UIImage, toSize size: CGSize) -> UIImage{
    let newCropWidth: CGFloat?
    let newCropHeight: CGFloat?

    if image.size.width < image.size.height {
        if image.size.width < size.width {
            newCropWidth = size.width
        } else {
            newCropWidth = image.size.width
        }
        newCropHeight = (newCropWidth! * size.height) / size.width
    } else {
        if image.size.height < size.height {
            newCropHeight = size.height
        } else {
            newCropHeight = image.size.height
        }
        newCropWidth = (newCropHeight! * size.width) / size.height
    }

    let x = image.size.width / 2.0 - newCropWidth! / 2.0
    let y = image.size.height / 2.0 - newCropHeight! / 2.0

    let cropRect = CGRect(x: x, y: y, width: newCropWidth!, height: newCropHeight!)
    let imageRef = image.cgImage!.cropping(to: cropRect)

    let cropped = UIImage(cgImage: imageRef!, scale: 1.0, orientation: .right)
    return cropped
}

然后我将该方法传递给CGSize(1080,1080)。我得到的图像是660,1080。有什么想法吗?

目的是裁剪图像,而不只是将图像居中显示。

1 个答案:

答案 0 :(得分:3)

您可以使用我在此answer中使用的相同方法,而不使用行UIBezierPath(ovalIn: breadthRect).addClip()

extension UIImage {
    var isPortrait:  Bool    { return size.height > size.width }
    var isLandscape: Bool    { return size.width > size.height }
    var breadth:     CGFloat { return min(size.width, size.height) }
    var breadthSize: CGSize  { return CGSize(width: breadth, height: breadth) }
    var breadthRect: CGRect  { return CGRect(origin: .zero, size: breadthSize) }
    var squared: UIImage? {
        UIGraphicsBeginImageContextWithOptions(breadthSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        guard let cgImage = cgImage?.cropping(to: CGRect(origin: CGPoint(x: isLandscape ? floor((size.width - size.height) / 2) : 0, y: isPortrait  ? floor((size.height - size.width) / 2) : 0), size: breadthSize)) else { return nil }
        UIImage(cgImage: cgImage).draw(in: breadthRect)
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}
let imageURL = URL(string: "https://www.sample.com/yourImage.jpg")!
let image = UIImage(data: try! Data(contentsOf: imageURL))!
let squared = image.squared