iOS 图片压缩(高性能)

作者: Miracle_任 | 来源:发表于2018-10-31 15:19 被阅读0次

之前分享过一篇关于图片压缩的文章传送门,但是近期发现存在一些问题,如果图片过大无法压缩到指定大小时,会导致图片消失。
so,再此,再为大家分享一篇关于图片压缩的技术。两种方式,大家可以针对自己的需要选择。

/*
 *maxLengthKB 压缩到的大小
 *image 准备压缩的图片
 */
-(void)compressWithMaxLengthKB:(NSUInteger)maxLengthKB image:(UIImage *)image Block :(void (^)(NSData *imageData))block{
    if (maxLengthKB <= 0 || [image isKindOfClass:[NSNull class]] || image == nil) block(nil);
    
    maxLengthKB = maxLengthKB*1024;
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        CGFloat compression = 1;
        NSData *data = UIImageJPEGRepresentation(image, compression);
        NSLog(@"初始 : %ld KB",data.length/1024);
        if (data.length < maxLengthKB){
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"压缩完成: %zd kb", data.length/1024);
                block(data);
            });
            return;
        }
        
        //质量压缩
        CGFloat scale = 1;
        CGFloat lastLength=0;
        for (int i = 0; i < 7; ++i) {
            compression = scale / 2;
            data = UIImageJPEGRepresentation(image, compression);
            NSLog(@"质量压缩中: %ld KB", data.length / 1024);
            if (i>0) {
                if (data.length>0.95*lastLength) break;//当前压缩后大小和上一次进行对比,如果大小变化不大就退出循环
                if (data.length < maxLengthKB) break;//当前压缩后大小和目标大小进行对比,小于则退出循环
            }
            scale = compression;
            lastLength = data.length;
            
        }
        NSLog(@"压缩图片质量后: %ld KB", data.length / 1024);
        if (data.length < maxLengthKB){
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"压缩完成: %zd kb", data.length/1024);
                block(data);
            });
            return;
        }
        
        //大小压缩
        UIImage *resultImage = [UIImage imageWithData:data];
        NSUInteger lastDataLength = 0;
        while (data.length > maxLengthKB && data.length != lastDataLength) {
            lastDataLength = data.length;
            CGFloat ratio = (CGFloat)maxLengthKB / data.length;
            NSLog(@"Ratio = %.1f", ratio);
            CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
                                     (NSUInteger)(resultImage.size.height * sqrtf(ratio)));
            UIGraphicsBeginImageContext(size);
            [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
            resultImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            data = UIImageJPEGRepresentation(resultImage, compression);
            NSLog(@"绘图压缩中: %ld KB", data.length / 1024);
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"压缩完成: %ld kb", data.length/1024);
            block(data);
        });return;
    });
    
}

相关文章

  • iOS 图片压缩(高性能)

    之前分享过一篇关于图片压缩的文章传送门,但是近期发现存在一些问题,如果图片过大无法压缩到指定大小时,会导致图片消失...

  • iOS 图片压缩方法

    iOS 图片压缩方法 更多图片处理方法见图片组件 BBWebImage iOS 图片压缩方法 两种图片压缩方法 两...

  • iOS 图片压缩、滤镜、剪切、渲染等解析

    iOS 图片压缩、滤镜、剪切、渲染等解析 iOS 图片压缩、滤镜、剪切、渲染等解析

  • iOS 图片压缩限制大小最优解

    iOS 图片压缩限制大小最优解 图片的两种压缩方法 1.1 压缩图片质量 1.2 压缩图片尺寸 压缩图片使图片文件...

  • iOS-图片解压缩相关

    SDWebimage中对图片的解压缩 谈谈 iOS 中图片的解压缩 iOS 开发:绘制像素到屏幕 探讨iOS 中图...

  • 探讨iOS 中图片的解压缩到渲染过程

    探讨iOS 中图片的解压缩到渲染过程 探讨iOS 中图片的解压缩到渲染过程

  • APP启动页

    安卓图片资源目录 iOS图片资源目录 图片压缩网址

  • imageView的处理

    图片的处理参见谈谈 iOS 中图片的解压缩

  • vue 图片压缩

    vue 图片压缩 上传图片大于100* 1024 的用canvas 来压缩来解决 然后IOS拍照上传会有图片旋转的...

  • vue 图片压缩

    vue 图片压缩 上传图片大于100* 1024 的用canvas来压缩来解决 然后IOS拍照上传会有图片旋转的问...

网友评论

    本文标题:iOS 图片压缩(高性能)

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