我希望用户在我的应用程序中继续,并在Swift中以编程方式按下按钮后截取应用程序。我知道UIGraphicsGetImageFromCurrentImageContext()
需要截图,但我不想要整个屏幕的图片。我想要一个矩形弹出(有点像裁剪工具),用户可以拖动和调整矩形的大小来截取屏幕的某个部分。我想让这个矩形遍历WKWebView
并裁剪一张网页视图。如何截取部分UIView的截图?
6
A
回答
16
标准快照技术是drawViewHierarchyInRect
。要获取图像的一部分,可以使用CGImageCreateWithImageInRect
。
因此,斯威夫特2:
extension UIView {
/// Create snapshot
///
/// - parameter rect: The `CGRect` of the portion of the view to return. If `nil` (or omitted),
/// return snapshot of the whole view.
///
/// - returns: Returns `UIImage` of the specified portion of the view.
func snapshot(of rect: CGRect? = nil) -> UIImage? {
// snapshot entire view
UIGraphicsBeginImageContextWithOptions(bounds.size, opaque, 0)
drawViewHierarchyInRect(bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// if no `rect` provided, return image of whole view
guard let rect = rect, let image = wholeImage else { return wholeImage }
// otherwise, grab specified `rect` of image
let scale = image.scale
let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
guard let cgImage = CGImageCreateWithImageInRect(image.CGImage!, scaledRect) else { return nil }
return UIImage(CGImage: cgImage, scale: scale, orientation: .Up)
}
}
在斯威夫特3:
extension UIView {
/// Create snapshot
///
/// - parameter rect: The `CGRect` of the portion of the view to return. If `nil` (or omitted),
/// return snapshot of the whole view.
///
/// - returns: Returns `UIImage` of the specified portion of the view.
func snapshot(of rect: CGRect? = nil) -> UIImage? {
// snapshot entire view
UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
drawHierarchy(in: bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// if no `rect` provided, return image of whole view
guard let image = wholeImage, let rect = rect else { return wholeImage }
// otherwise, grab specified `rect` of image
let scale = image.scale
let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
guard let cgImage = image.cgImage?.cropping(to: scaledRect) else { return nil }
return UIImage(cgImage: cgImage, scale: scale, orientation: .up)
}
}
,并使用它,你可以这样做:
if let image = webView.snapshot(of: rect) {
// do something with `image` here
}
3
这是How to capture UIView to UIImage without loss of quality on retina display(2.3)先前提出的问题,但在迅速扩大:
extension UIView {
class func image(view: UIView) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0)
guard let ctx = UIGraphicsGetCurrentContext() else {
return nil
}
view.layer.renderInContext(ctx)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}
func image() -> UIImage? {
return UIView.image(self)
}
}
所以您可以得到一个视图中的图像与UIView.image(theView)
或要求的观点本身let viewImage = self.view.image()
不要忘记,这是粗糙的,可能需要进一步寻找线程安全等......
相关问题
- 1. iOS 7截取部分UIView的屏幕截图
- 2. 如何截取应用程序窗口的一部分截图?
- 3. 如何截取webview部分的截图仅使用Appium
- 4. 如何使用NSThread截取UIView的截图?
- 5. 截取UIView的截图,包括3个UITableView(可见+不可见)部分
- 6. 如何截取android截图
- 7. Django:如何获取“截断字”的截断部分
- 8. 如何截取HTML表单的截图?
- 9. Android cocos2d如何截取CCscene的截图?
- 10. 如何截取特定LinearLayout的截图?
- 11. 如何截取网站的截图
- 12. 如何截取Flex Spark VideoDisplay的截图?
- 13. 如何截取当前的MapView截图?
- 14. 如何使用PHP截取外部网页的iFrame的截图?
- 15. 仅截取表单的一部分屏幕截图?
- 16. 如何截取Pygame屏幕中的某个部分的屏幕截图
- 17. 如何截取底部布局的截图
- 18. iOS的截图部分
- 19. 在UIView中截取选定框架的屏幕截图
- 20. 如何截取UIView的截图并使用它有模糊背景?
- 21. 截取iFrame的截图
- 22. iOS截取tableview的截图
- 23. 在截取屏幕截图之前合并UIView和UIImageView
- 24. C++截取屏幕截图
- 25. 截取屏幕截图
- 26. 如何获取ios中隐形部分的屏幕截图?
- 27. 如何分享截图?
- 28. 如何在不添加子视图的情况下截取uiview?
- 29. 如何获取WebView截图
- 30. 如何抓取网站并截取每个网页的截图?
伟大的工作一如既往罗布。谢谢。 – damirstuhec
完美的解决方案。还有其他的,但他们捕捉整个屏幕。这是两个解决方案。 – Septronic