美文网首页
iOS 保存图片到相册或沙盒出现白边

iOS 保存图片到相册或沙盒出现白边

作者: Assen阿森纳 | 来源:发表于2024-03-06 15:06 被阅读0次

    最近在项目中碰到把有圆角的png图片保存到相册或沙盒中会出现白边的情况。
    如下图:


    图1.jpg

    做了下测试发现存的图片格式变成了JPEG格式。奇怪了,赶紧网上搜了下。

    原来苹果使用的是JPEG格式作为默认的图片文件格式,而JPEG格式不支持保存透明通道数据,导致存相册和沙盒的时候默认转成了JPEG格式,所以我们可以转换成PNG格式的图。

    原理:图片格式为JPG或JPEG的时候默认情况下透明部分将填充白色。这一限制的原因在于JPEG格式是一种有损压缩格式,即在压缩过程中会对图像数据进行丢失以达到更高的压缩比例。而透明通道数据是通过色值来表示的,如果对其进行压缩丢失,将会导致图像出现锯齿和颜色偏移等问题。因此,需要保存带有透明通道数据的图片,我们可以选择使用支持透明通道的文件格式,例如PNG格式。(ps:网上搜索的理论知识)

    解决后的图片如下:


    图2.png

    优化代码如下:

    - (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或隔空投送是正常的。哈哈

    相关文章

      网友评论

          本文标题:iOS 保存图片到相册或沙盒出现白边

          本文链接:https://www.haomeiwen.com/subject/gdejzdtx.html