以编程方式从底部裁剪图像

Bor*_*ell 6 crop uiimageview ios swift

我正在研究自定义相机应用程序.事情很好.

但是我从底部裁剪图像时遇到了问题.即,裁剪后的图像与原始图像具有完全相同的宽度,但高度将是原始图像的1/3,并且必须从底部开始.

例如,这是我只需要红色部分的完整图像

ale*_*nik 22

Swift 3解决方案:

func cropBottomImage(image: UIImage) -> UIImage {
    let height = CGFloat(image.size.height / 3)
    let rect = CGRect(x: 0, y: image.size.height - height, width: image.size.width, height: height)
    return cropImage(image: image, toRect: rect)
}
Run Code Online (Sandbox Code Playgroud)

使用rect进行裁剪的辅助方法:

func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage{
    let imageRef:CGImage = image.cgImage!.cropping(to: rect)!
    let croppedImage:UIImage = UIImage(cgImage:imageRef)
    return croppedImage
}
Run Code Online (Sandbox Code Playgroud)


roy*_*yl8 8

这几乎是Alexburtnik的答案

但只是提到UIImage.size是逻辑大小(在"点"中)

但是,CGImage.cropping()使用了实际尺寸(以"像素"为单位)

因此,如果你使用带有@ 2x或@ 3x修饰符的图像,你会发现裁剪实际上是预期的一半或三分之一.

因此,在裁剪时,您可以考虑首先将rect乘以图像的"scale"属性,如下所示:

func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage? {
    var rect = rect
    rect.size.width = rect.width * image.scale
    rect.size.height = rect.height * image.scale

    guard let imageRef = image.cgImage?.cropping(to: rect) else {
        return nil
    }

    let croppedImage = UIImage(cgImage:imageRef)
    return croppedImage
}
Run Code Online (Sandbox Code Playgroud)