我想捕捉iPhone屏幕的特定部分。我使用了UIGraphicsBeginImageContextWithOptions
,但無法捕捉屏幕的一部分。 請幫幫我。ios如何捕捉屏幕的特定部分
7
A
回答
15
您可以使用UIGraphicsGetImageFromCurrentContext
拍攝截圖。從內存寫下面的代碼,所以錯誤成爲可能。請自行修正。
- (UIImage*)captureView:(UIView *)yourView {
CGRect rect = [[UIScreen mainScreen] bounds];
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[yourView.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
25
您可以使用此代碼
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGRect rect = CGRectMake(250,61 ,410, 255);
CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect);
UIImage *img = [UIImage imageWithCGImage:imageRef];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
CGImageRelease(imageRef);
0
另一種方法捕捉到清晰的屏幕截圖;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(self.captureView.frame.size, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(self.captureView.frame.size);
[self.captureView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
[viewImage drawInRect:CGRectMake(0.0, 0.0, 640,960)];
//NSData*m_Imgdata=UIImagePNGRepresentation(viewImage);
NSData*m_Imgdata=UIImageJPEGRepresentation(viewImage, 1.0);
// UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
UIGraphicsEndImageContext();
1
由@Superdev的答案是正確的地方,我想補充的是一個小技巧,如果你想捕捉父視圖和子視圖避免(尤其是覆蓋視圖),你可以做的是使該子視圖屬性,並使用以下
CGFloat width = CGRectGetWidth(self.view.bounds);
CGFloat height = CGRectGetHeight(self.view.bounds);
_overlayView.hidden = YES;
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGRect rect = CGRectMake(0,0 ,width, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect);
UIImage *img = [UIImage imageWithCGImage:imageRef];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
CGImageRelease(imageRef);
_overlayView.hidden = NO;
它的一個小竅門,希望有人會發現它有用
3
這裏有UIView
迅速擴展,要麼捕捉整個視圖或視圖中的框架。它考慮了屏幕比例。
extension UIView {
func imageSnapshot() -> UIImage {
return self.imageSnapshotCroppedToFrame(nil)
}
func imageSnapshotCroppedToFrame(frame: CGRect?) -> UIImage {
let scaleFactor = UIScreen.mainScreen().scale
UIGraphicsBeginImageContextWithOptions(bounds.size, false, scaleFactor)
self.drawViewHierarchyInRect(bounds, afterScreenUpdates: true)
var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if let frame = frame {
// UIImages are measured in points, but CGImages are measured in pixels
let scaledRect = CGRectApplyAffineTransform(frame, CGAffineTransformMakeScale(scaleFactor, scaleFactor))
if let imageRef = CGImageCreateWithImageInRect(image.CGImage, scaledRect) {
image = UIImage(CGImage: imageRef)
}
}
return image
}
}
+1
嗨,jDutton。我愛你的答案。決定更新Swift 3.0的代碼。 –
+0
非常感謝你! – Jerome
0
SWIFT 3.0 Xcode8版本 來自@jDutton答案,併爲我工作。
extension UIView {
func imageSnapshot() -> UIImage {
return self.imageSnapshotCroppedToFrame(frame: nil)
}
func imageSnapshotCroppedToFrame(frame: CGRect?) -> UIImage {
let scaleFactor = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(bounds.size, false, scaleFactor)
self.drawHierarchy(in: bounds, afterScreenUpdates: true)
var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
if let frame = frame {
// UIImages are measured in points, but CGImages are measured in pixels
let scaledRect = frame.applying(CGAffineTransform(scaleX: scaleFactor, y: scaleFactor))
if let imageRef = image.cgImage!.cropping(to: scaledRect) {
image = UIImage(cgImage: imageRef)
}
}
return image
}
}
如果你崩潰,並收到以下消息:
GContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
試試這個solution
希望爲節省您的時間!
相關問題
- 1. 如何在QML中捕捉屏幕的特定部分?
- 2. iOS屏幕捕捉/錄製
- 3. Xcode中:試圖捕捉部分屏幕
- 4. 的屏幕捕捉
- 5. 如何使用AVCaptureStillImageOutput捕捉屏幕的一部分?
- 6. Ios屏幕捕捉優勝美地
- 7. 如何使用座標「屏幕」屏幕的特定部分?
- 8. 如何捕獲屏幕的一部分
- 9. 捕捉屏幕的區域
- 10. .NET的屏幕捕捉
- 11. 最佳屏幕分辨率捕捉屏幕演示的演示
- 12. 捕捉一些iphone屏幕
- 13. 可可屏幕捕捉?
- 14. 屏幕捕捉與幀
- 15. Gdk/X11屏幕捕捉
- 16. iPhone屏幕捕捉問題
- 17. 幫助捕捉屏幕
- 18. 如何以編程方式阻止iOS屏幕捕捉?
- 19. 如何捕捉屏幕和檢測屏幕信息
- 20. 獻給SurfaceView屏幕的特定部分
- 21. 動畫屏幕的特定部分
- 22. 如何捕捉屏幕的一部分並將其保存到BMP?
- 23. 採取屏幕的特定部分的屏幕截圖
- 24. 如何捕捉屏幕並忽略圖像中的特定窗口
- 25. C++ Direct3D的多屏幕捕捉
- 26. 並行的C#屏幕捕捉?
- 27. 高效的屏幕捕捉程序
- 28. 用BitBlt捕捉YUV格式的屏幕
- 29. 捕捉屏幕的射門從0,0
- 30. 如何捕捉表格的一部分
你想從你的機器捕獲一個屏幕截圖,或者你想通過代碼在你的應用中捕獲一個區域? – mAc
@mAc顯然他想用代碼來做。如果不是爲什麼他使用UIGraphicsBeginImageContextWithOptions – Krishnabhadra