iOS图片压缩

http://www.jianshu.com/p/974a9537d9f7


我的这个文章是修改简书的blog,本来想在 [作者:郑莫轩 ] 的blog 下评论,但是代码太多了,只能先用一个blog 记录下来,供大家参考。
[代码大放送--iOS图片压缩]
(http://www.jianshu.com/p/974a9537d9f7/comments/2623143#comment-2623143)

- (void)viewDidLoad {
    [super viewDidLoad];
    [self compressedImageFiles:[UIImage imageNamed:@"1.jpg"] imageKB:20 imageBlock:^(UIImage *image) {



    }];


}

/**
 *  压缩图片
 *
 *  @param image       需要压缩的图片
 *  @param fImageBytes 希望压缩后的大小(以KB为单位)
 *
 *  @return 压缩后的图片
 */
- (void)compressedImageFiles:(UIImage *)image
                     imageKB:(CGFloat)fImageKBytes
                  imageBlock:(void(^)(UIImage *image))block {

    __block UIImage *imageCope = image;
    CGFloat fImageBytes = fImageKBytes * 1024;//需要压缩的字节Byte

    __block NSData *uploadImageData = nil;

    uploadImageData = UIImagePNGRepresentation(imageCope);
    NSLog(@"图片压前缩成 %fKB",uploadImageData.length/1024.0);
    CGSize size = imageCope.size;
    CGFloat imageWidth = size.width;
    CGFloat imageHeight = size.height;

    if (uploadImageData.length > fImageBytes && fImageBytes >0) {

        dispatch_async(dispatch_queue_create("CompressedImage", DISPATCH_QUEUE_SERIAL), ^{

            /* 宽高的比例 **/
            CGFloat ratioOfWH = imageWidth/imageHeight;
            /* 压缩率 **/
            CGFloat compressionRatio = fImageBytes/uploadImageData.length;
            /* 宽度或者高度的压缩率 **/
            CGFloat widthOrHeightCompressionRatio = sqrt(compressionRatio);

            CGFloat dWidth   = imageWidth *widthOrHeightCompressionRatio;
            CGFloat dHeight  = imageHeight*widthOrHeightCompressionRatio;
            if (ratioOfWH >0) { /* 宽 > 高,说明宽度的压缩相对来说更大些 **/
                dHeight = dWidth/ratioOfWH;
            }else {
                dWidth  = dHeight*ratioOfWH;
            }

            imageCope = [self drawWithWithImage:imageCope width:dWidth height:dHeight];
            uploadImageData = UIImagePNGRepresentation(imageCope);

            NSLog(@"当前的图片已经压缩成 %fKB",uploadImageData.length/1024.0);
            //微调
            NSInteger compressCount = 0;
            /* 控制在 1M 以内**/
            while (fabs(uploadImageData.length - fImageBytes) > 1024) {
                /* 再次压缩的比例**/
                CGFloat nextCompressionRatio = 0.9;

                if (uploadImageData.length > fImageBytes) {
                    dWidth = dWidth*nextCompressionRatio;
                    dHeight= dHeight*nextCompressionRatio;
                }else {
                    dWidth = dWidth/nextCompressionRatio;
                    dHeight= dHeight/nextCompressionRatio;
                }

                imageCope = [self drawWithWithImage:imageCope width:dWidth height:dHeight];
                uploadImageData = UIImagePNGRepresentation(imageCope);

                /*防止进入死循环**/
                compressCount ++;
                if (compressCount == 10) {
                    break;
                }

            }

            NSLog(@"图片已经压缩成 %fKB",uploadImageData.length/1024.0);
            imageCope = [[UIImage alloc] initWithData:uploadImageData];

            dispatch_sync(dispatch_get_main_queue(), ^{
                block(imageCope);
            });
        });
    }
    else
    {
        block(imageCope);
    }
}

/* 根据 dWidth dHeight 返回一个新的image**/
- (UIImage *)drawWithWithImage:(UIImage *)imageCope width:(CGFloat)dWidth height:(CGFloat)dHeight{

    UIGraphicsBeginImageContext(CGSizeMake(dWidth, dHeight));
    [imageCope drawInRect:CGRectMake(0, 0, dWidth, dHeight)];
    imageCope = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return imageCope;

}


文/李重阳_arc(简书作者)
原文链接:http://www.jianshu.com/p/d3ff253251cb
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,UniApp 主包的大小确实是一个普遍的问题。UniApp 是一个跨平台的开发框架,它可以同时构建运行在多个平台上的应用程序,包括iOS、Android和Web。由于需要兼容多个平台,UniApp 主包会包含所有平台的代码和资源,这就导致了主包的体积相对较大。 有几个常见的原因可能导致 UniApp 主包变得很大: 1. 依赖库和插件:在使用 UniApp 开发过程中,很可能会引入一些第三方的依赖库和插件。这些库和插件的代码和资源会被打包到主包中,增加了主包的体积。 2. 图片资源:如果应用程序中使用了大量的图片资源,特别是高清图片,那么这些图片也会占据主包的很大一部分空间。 3. 静态资源:其他静态资源,如音频、视频等文件,也会增加主包的大小。 为了减小 UniApp 主包的大小,你可以尝试以下几种方法: 1. 压缩图片:使用合适的图片压缩工具来减小图片的大小,可以使用在线工具或者插件来进行图片压缩。 2. 动态加载:将一些不常用或者较大的资源文件改为动态加载,按需加载,减少主包的体积。 3. 按需加载插件和依赖库:只引入必要的插件和依赖库,避免引入无用的代码和资源。 4. 代码优化:对代码进行优化,减少冗余代码和不必要的资源引用,精简代码体积。 5. 分包加载:将一些功能模块拆分为子包,按需加载,减小主包的体积。 这些方法可以帮助你减小 UniApp 主包的大小,提升应用程序的加载速度和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值