我怎样才能动态地使用 CGRect()?

How can I use CGRect() dynamically?

我有以下 scene example,我可以在其中根据选择(红色方块)裁剪图像。

该正方形具有动态高度和宽度 - 基于这一事实,我想使用选定的高度和宽度来裁剪红色正方形内部的内容。

我用于裁剪的函数来自 Apple developer,看起来像这样:

func cropImage(_ inputImage: UIImage, toRect cropRect: CGRect, viewWidth: CGFloat, viewHeight: CGFloat) -> UIImage? 
{    
    let imageViewScale = max(inputImage.size.width / viewWidth,
                             inputImage.size.height / viewHeight)

    // Scale cropRect to handle images larger than shown-on-screen size
    let cropZone = CGRect(x:cropRect.origin.x * imageViewScale,
                          y:cropRect.origin.y * imageViewScale,
                          width:cropRect.size.width * imageViewScale,
                          height:cropRect.size.height * imageViewScale)

    // Perform cropping in Core Graphics
    guard let cutImageRef: CGImage = inputImage.cgImage?.cropping(to:cropZone)
    else {
        return nil
    }

    // Return image to UIImage
    let croppedImage: UIImage = UIImage(cgImage: cutImageRef)
    return croppedImage
}

现在。我想使用给定的高度和宽度来裁剪该选区。

 let croppedImage =  cropImage(image!, toRect: CGRect(x:?? , y:?? , width: ??, height: ??), viewWidth: ??, viewHeight: ??) 

为了根据上述动态选择裁剪图像,这些参数应该填写什么?

好的,我们假设您的图像位于 imageView 中,它位于您屏幕的某个位置。 rect 是一个变量,您选择的帧(与 imageView.frame 相关)存储在其中。所以结果是:

let croppedImage =  cropImage(image!, toRect: rect, viewWidth: imageView.width, viewHeight: imageView.height)

好的,因为您只有 widthheight 裁剪形状的信息。 xy 需要您自己计算。

首先,让我们考虑这些信息:

// let's pretend this is a sample of size that your crop tool provides to you
let cropSize = CGSize(width: 120, height: 260)

接下来,您需要获取图像的显示 大小(widthheight)。此处的显示尺寸是图像的帧尺寸,而不是图像本身的尺寸。

// again, lets pretend it's just a frame size of your image
let imageSize = CGSize(width: 320, height: 480)

有了这些信息,您就可以获得xy组成一个CGRect,然后提供给您想要的裁剪功能。

let x = (imageSize.width - cropSize.width) / 2
let y = (imageSize.height - cropSize.height) / 2

现在,您可以创建一个矩形来像这样裁剪图像:

let cropRect = CGRect(x: x, y: y, width: cropSize.width, height: cropSize.height)

使用 cropRect,您可以在问题中提到的 croppingcropImage 函数上使用。

我已经使用了您所有答案中的信息,尤其是@matt 的评论,这是最终解决方案。

使用我的红色方块返回的输入值,我将原来的 Crop 函数应用到这个:

    func cropImage(_ inputImage: UIImage, width: Double, height: Double) -> UIImage?
    {

        let imsize = inputImage.size
        let ivsize = UIScreen.main.bounds.size
        
        var scale : CGFloat = ivsize.width / imsize.width
        if imsize.height * scale < ivsize.height {
            scale = ivsize.height / imsize.height
        }

        let croppedImsize = CGSize(width:height/scale, height:width/scale)

        
        let croppedImrect =
            CGRect(origin: CGPoint(x: (imsize.width-croppedImsize.width)/2.0,
                                   y: (imsize.height-croppedImsize.height)/2.4),
                   size: croppedImsize)
        
        let r = UIGraphicsImageRenderer(size:croppedImsize)
        let croppedIm = r.image { _ in
            inputImage.draw(at: CGPoint(x:-croppedImrect.origin.x, y:-croppedImrect.origin.y))
        }
        
        return croppedIm
        
    }