我希望用戶在我的應用程序中繼續,並在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