如何裁剪屏幕截图的特定片段?

时间:2019-08-22 06:24:47

标签: ios swift xcode user-interface graphics

我要裁剪屏幕截图的矩形部分。我现在执行屏幕快照和后续裁切操作时,没有任何图像。下面是我想要裁剪的图像(矩形网格)和我的代码

Cropping image with Swift and put it on center position

中提出的解决方案

不适用,因为我正在尝试裁剪屏幕截图,而不裁剪现有图像。如上述解决方案中所述,图像裁剪对于旋转的UIImageView不起作用。

enter image description here

代码:

private func takeScreenShotCrop(cropGridRect: CGRect) -> UIImage?{

    let cropGridOrigin = CGPoint.init(x: cropGridRect.origin.x, y: cropGridRect.origin.y)
    let cropGridSize = CGSize.init(width: cropGridRect.width, height: cropGridRect.height)
    let cropZoneRect = CGRect.init(origin: cropGridOrigin, size: cropGridSize)

    UIGraphicsBeginImageContext(cropGridSize)
    view.drawHierarchy(in: cropZoneRect, afterScreenUpdates: true)
    guard let croppedIm: UIImage = UIGraphicsGetImageFromCurrentImageContext() else{return nil}
    UIGraphicsEndImageContext()
    return croppedIm
}

1 个答案:

答案 0 :(得分:0)

您的问题可能有点过于笼统,因为您没有提供有关层次结构的数据。我希望有一个视图(UIView或它的子类),该视图具有包含旋转的特定变换(从现在开始将其称为imageView)。我希望有一个显示该网格的视图(从现在开始将其称为panel)。我希望imageViewpanel具有一些公共的超级视图父级(它们不需要完全相同的超级视图,它们只需要位于相同的窗口层次结构中即可)。

您可以相互关联地转换框架。由于转换,这有点痛苦,但是通常您可以编写如下内容:

func screenshotView(_ viewToScreenshot: UIView, croppedBy cropView: UIView) -> UIImage? {

    guard let originalScreenshot: UIImage = {
        UIGraphicsBeginImageContext(viewToScreenshot.bounds.size)
        viewToScreenshot.drawHierarchy(in: viewToScreenshot.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }() else { return nil }


    let panel = UIView(frame: cropView.bounds)
    let imageView = UIImageView(frame: viewToScreenshot.bounds)
    imageView.image = originalScreenshot

    let viewOriginalTransform = viewToScreenshot.transform
    viewToScreenshot.transform = .identity
    imageView.frame = viewToScreenshot.convert(viewToScreenshot.bounds, to: cropView)
    viewToScreenshot.transform = viewOriginalTransform

    panel.addSubview(imageView)
    imageView.transform = viewOriginalTransform

    UIGraphicsBeginImageContext(panel.bounds.size)
    panel.drawHierarchy(in: panel.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image
}

那么您的情况就是

let image = screenshotView(imageView, croppedBy: panel)

因此,我们要做的是首先获取您图像视图的屏幕截图。这既不会裁剪,也不会旋转。这只是视图的内部快照。如果实际上imageViewUIImageView并且图像按原样显示(没有圆角的效果),则可以跳过该操作,仅使用图像。

然后将快照放入新创建的面板中,并根据两个视图之间的框架关系调整其框架。我们从新生成的面板中创建一个新快照,这就是我们想要的结果。

要创建“图像视图”优化,您只需添加一行:

guard let originalScreenshot: UIImage = {
    if let image = (viewToScreenshot as? UIImageView)?.image { return image }
    UIGraphicsBeginImageContext(viewToScreenshot.bounds.size)
    viewToScreenshot.drawHierarchy(in: viewToScreenshot.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}() else { return nil }