使用多个 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 的屏幕截图显示白色背景,同时将图像保存在图库中的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画与 CALayers

尝试使用 CALayers 为水龙头的水滴设置动画

Swift:沿贝塞尔路径渐变(使用 CALayers)

动画 calayers 不断跟随手指位置

如何同时成功地为多个 CALayers 设置动画?

在不同的边上添加不同宽度的边框