我要裁剪屏幕截图的矩形部分。我现在执行屏幕快照和后续裁切操作时,没有任何图像。下面是我想要裁剪的图像(矩形网格)和我的代码
在Cropping image with Swift and put it on center position
中提出的解决方案不适用,因为我正在尝试裁剪屏幕截图,而不裁剪现有图像。如上述解决方案中所述,图像裁剪对于旋转的UIImageView不起作用。
代码:
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
}
答案 0 :(得分:0)
您的问题可能有点过于笼统,因为您没有提供有关层次结构的数据。我希望有一个视图(UIView
或它的子类),该视图具有包含旋转的特定变换(从现在开始将其称为imageView
)。我希望有一个显示该网格的视图(从现在开始将其称为panel
)。我希望imageView
和panel
具有一些公共的超级视图父级(它们不需要完全相同的超级视图,它们只需要位于相同的窗口层次结构中即可)。
您可以相互关联地转换框架。由于转换,这有点痛苦,但是通常您可以编写如下内容:
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)
因此,我们要做的是首先获取您图像视图的屏幕截图。这既不会裁剪,也不会旋转。这只是视图的内部快照。如果实际上imageView
是UIImageView
并且图像按原样显示(没有圆角的效果),则可以跳过该操作,仅使用图像。
然后将快照放入新创建的面板中,并根据两个视图之间的框架关系调整其框架。我们从新生成的面板中创建一个新快照,这就是我们想要的结果。
要创建“图像视图”优化,您只需添加一行:
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 }