使用多个 CALayers 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中
Posted
技术标签:
【中文标题】使用多个 CALayers 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中【英文标题】:Capturing Screenshot of UIVIew with multiple CALayers displays white background while save image in gallery 【发布时间】:2015-07-16 12:16:37 【问题描述】:我有一个 UIView,它有不同大小的不同 CALayer。
当我尝试将 UIView 作为图像保存到图库时,它会失去透明度:
我的代码是:
- (UIImage *) imageWithView:(UIView *)view
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [UIScreen mainScreen].scale);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
//获取图片
UIImage *img=[self imageWithView:MainView];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
注意:当我调试代码时,它显示透明图像,但是当我在图库中看到它时,它显示为白色背景
【问题讨论】:
你如何设置透明度? 我有一个 UIView,它有不同的 CALayers,每一层的大小都不一样。例如,层的大小小于 MainView 的大小 没问题,它会显示黑色背景或白色背景,但实际上它是透明的 我可以做些什么来删除这个黑色或白色背景? 顺便说一句,你可以通过0.f
而不是[UIScreen mainScreen].scale
,因为它是相同的并且更具可读性:) 你的方式也是正确的。在我看来,更合适的名字是imageFromView
。为了代码的完整性,最好在任何地方都有相同的样式 - 例如,一旦你在=
之前和之后写了空格,然后你就不用输入它们了。稍后其他开发人员会更容易阅读。
【参考方案1】:
我已经尝试过您的代码。您可以尝试以下实现:
- (void)viewDidLoad
[super viewDidLoad];
UIView *tmpView = [UIView new];
tmpView.frame = self.view.bounds;
tmpView.backgroundColor = [UIColor clearColor];
[self.view addSubview:tmpView];
UIImage *img = [self imageWithView:tmpView];
[self saveInJPGFormat:img];
[self saveInPNGFormat:img];
- (void)saveInJPGFormat:(UIImage *)image
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
- (void)saveInPNGFormat:(UIImage *)image
NSData* imageData = UIImagePNGRepresentation(image);
UIImage* pngImage = [UIImage imageWithData:imageData];
UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);
- (UIImage *) imageWithView:(UIView *)view
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [UIScreen mainScreen].scale);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
您的方法以 JPG 格式保存到相机胶卷。 JPG 无法保留 Alpha 通道。 取自https://***.com/a/10279075/849616 的第二种方法将图像保存为PNG。我可以打开它,我可以看穿图像(保存了alpha通道)。
顺便说一句:ofc 那是非常肮脏和快速的代码。实际上,您应该在UIImage
上为这些方法创建一个类别。还要保持 MVC 和视图和图层坚持情节提要或单独的 UIView 子类。
图片来自我的相册: 预览屏幕,确保它是空的:
所以这个方法是有效的。
【讨论】:
以上是关于使用多个 CALayers 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中的主要内容,如果未能解决你的问题,请参考以下文章