最近在项目中碰到把有圆角的png图片保存到相册或沙盒中会出现白边的情况。
如下图:
做了下测试发现存的图片格式变成了JPEG格式。奇怪了,赶紧网上搜了下。
原来苹果使用的是JPEG格式作为默认的图片文件格式,而JPEG格式不支持保存透明通道数据,导致存相册和沙盒的时候默认转成了JPEG格式,所以我们可以转换成PNG格式的图。
原理:图片格式为JPG或JPEG的时候默认情况下透明部分将填充白色。这一限制的原因在于JPEG格式是一种有损压缩格式,即在压缩过程中会对图像数据进行丢失以达到更高的压缩比例。而透明通道数据是通过色值来表示的,如果对其进行压缩丢失,将会导致图像出现锯齿和颜色偏移等问题。因此,需要保存带有透明通道数据的图片,我们可以选择使用支持透明通道的文件格式,例如PNG格式。(ps:网上搜索的理论知识)
解决后的图片如下:
优化代码如下:
- (UIImage *)pngFromImage:(UIImage *)image {
// UIImage对象保存为PNG格式的函数(函数会返回一个包含图片PNG数据的NSData对象)
NSData *imageData = UIImagePNGRepresentation(image);
if (imageData) {
UIImage *imagePng = [UIImage imageWithData:imageData];
return imagePng;
}
return nil;
}
- (void)saveImage:(UIImage *)image {
UIImage *pngImage = [self pngFromImage:image];
if (pngImage) {
// 请求相册访问权限自己加...
// 保存相册的方法
UIImageWriteToSavedPhotosAlbum(pngImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
} else {
NSLog(@"保存失败..");
}
}
保存的时候调用一下saveImage方法就可以。
贴一个在线OC转换Swift的地址:
https://swiftify.com/converter/code/
参考:https://blog.csdn.net/zcl369369/article/details/114138977
网上大神的假设:UIGraphicsGetImageFromCurrentImageContext方法截图获取的图片,如未指明图片的格式,苹果保存时就默认一个有损且不含alpha通道的JPEG格式,毕竟这格式占用磁盘空间小。如果用代码把图片转换为png格式后,苹果就不会再默认进行优化。
闲话:悠闲的童鞋可以试试一张带有圆角的透明图用wechat发也会出现白边,QQ或隔空投送是正常的。哈哈