以 Swift 编程语言实现程序化截图并模糊处理

4

我希望能够通过程序截取我的应用程序的屏幕截图,代码已经可行,但是我有一个带有模糊效果的UIVisualEffectView,截屏后的图片没有了模糊效果!如何让截屏也包含模糊效果呢?

UIGraphicsBeginImageContextWithOptions(fullView.bounds.size, true, 1)
self.fullView.layer.renderInContext(UIGraphicsGetCurrentContext())
var viewImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil)
3个回答

4
为了在程序中拍摄屏幕图像时保留UIVisualEffectView模糊效果,您必须拍摄整个屏幕的图像。
以下是苹果提供的更为技术性的定义:
许多效果需要由托管UIVisualEffectView的窗口提供支持。仅尝试对UIVisualEffectView进行快照将导致不包含效果的快照。要拍摄包含UIVisualEffectView的视图层次结构的快照,必须拍摄包含它的整个UIWindow或UIScreen的快照。-来源:Apple文档

谢谢你的回答,如果没有使用UIVisualEffectView,有没有其他方法在截屏时为屏幕的某个部分添加模糊效果? - BandarAljahmi
1
@BandarAljahmi 我添加了一个编程模糊图像的示例,尽管这应该是被接受的答案。 - Jasper Blues

2

在截屏后,可以通过编程方式添加模糊效果。以下是使用GPUImage库的示例,该库可以使用CocoaPods安装。也可以使用本机苹果库实现类似的效果。

GPUImagePicture *picture = [[GPUImagePicture alloc] initWithImage:snapShot];
GPUImageiOSBlurFilter *blurFilter = [[GPUImageiOSBlurFilter alloc] init];
[blurFilter setBlurRadiusInPixels:4];

[picture addTarget:blurFilter];
[blurFilter useNextFrameForImageCapture];
[picture processImage];

UIImage *processed = [blurFilter imageFromCurrentFramebuffer];

1
我曾经遇到过同样的问题。我有一个带有视觉效果(模糊)的背景图像和一些其他非模糊视图的视图控制器,并希望对该控制器进行截屏。
正如@user3721428所指出的,尝试捕获视图是行不通的。令我惊讶的是,尝试在上下文中渲染窗口层也不起作用。
有效的方法是从UIScreen获取一个快照视图: let view = UIScreen.main.snapshotView(afterScreenUpdates: true) 然后使用 @neave在这里提供的方法从该视图中获取图像。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接