使用多个 CALayer 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中
Capturing Screenshot of UIVIew with multiple CALayers displays white background while save image in gallery
我有一个 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);
注意:当我调试代码时,它显示透明图像,但当我在画廊中看到它显示白色背景
我试过你的代码。您可以尝试以下实现:
- (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 通道。
取自 的第二种方法将图像保存为 PNG。我可以打开它,我可以看到图像(alpha 通道已保存)。
顺便说一句:ofc 这是非常肮脏和快速的代码。实际上,您应该为这些方法在 UIImage
上做一个分类。同时保持 MVC 和视图和图层坚持故事板或分离 UIView 子类。
来自我的相册的图片:
预览屏幕,确保它是空的:
所以该方法有效。
我有一个 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);
注意:当我调试代码时,它显示透明图像,但当我在画廊中看到它显示白色背景
我试过你的代码。您可以尝试以下实现:
- (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 通道。 取自 的第二种方法将图像保存为 PNG。我可以打开它,我可以看到图像(alpha 通道已保存)。
顺便说一句:ofc 这是非常肮脏和快速的代码。实际上,您应该为这些方法在 UIImage
上做一个分类。同时保持 MVC 和视图和图层坚持故事板或分离 UIView 子类。
来自我的相册的图片:
所以该方法有效。