如何通过数据大小缩小IOS中的UIImage

 阿吉 发布于 2023-02-12 16:57

我期待缩减一个UIImageiOS.

我已经看到了下面的其他问题以及他们如何按尺寸缩小图像的方法. 调整图像大小Objective-C
如何在iphone中以objective-c编程调整图像
大小调整UIImage大小的最简单方法?

这些问题都是基于将图像重新调整为特定大小.在我的情况下,我希望根据最大尺寸重新调整/缩小图像.

例如,我想将最大NSData大小设置为500 KB.我知道我可以像这样得到图像的大小://检查返回图像的大小

NSData *imageData = UIImageJPEGRepresentation(image, 0.5);

// Log out the image size
NSLog(@"%lu KB",(imageData.length/1024));

我想做的是这里的某种形式的循环.如果尺寸大于我设置的最大尺寸,我想稍微缩小图像,然后检查尺寸.如果尺寸仍然太大,则再次缩小,然后再次检查,直到它低于最大设定尺寸.

我不确定最好的办法是什么.理想情况下,我不希望始终将图像缩小到特定大小,但每次只能略微缩小图像.这样我可以拥有最大的(大小w/h)图像本身和最大尺寸(字节).如果我一次只略微缩小,那么最好的方法是什么呢?

编辑 要确认,我希望重新调整实际图像的大小,但重新调整图像的大小,使其小于最大NSData长度.例如: -
检查NSData长度
-If高于我想要将UIImage传递给方法 的最大值 - 然后
循环通过此方法每次稍微调整实际图像大小
-Until它在最大NSData长度以下,然后返回图像?

2 个回答
  • 除了最大尺寸,您还需要选择最小尺寸以及决定性能.例如,您可以检查大小UIImageJPEGRepresentation(image, 1.0).如果太大,你会检查0.950.1

    一种可能的方法是获得大小,UIImageJPEGRepresentation(image, 1.0)并查看它太大的百分比.例如,假设它是600kB.然后你应该计算500.0 / 600粗略的0.83.那么呢UIImageJPEGRepresentation(image, 0.83).这不会给出500kB,但它可能足够接近.

    另一种方法是开始UIImageJPEGRepresentation(image, 1.0).它太大了然后UIImageJPEGRepresentation(image, 0.5)如果太大然后去,0.25但如果太小了去0.75.保持分裂差异,直到达到所需大小的可接受范围.

    2023-02-12 17:01 回答
  • 现在,你有一个常规说:

    // Check if the image size is too large
    if ((imageData.length/1024) >= 1024) {
    
        while ((imageData.length/1024) >= 1024) {
            NSLog(@"While start - The imagedata size is currently: %f KB",roundf((imageData.length/1024)));
    
            // While the imageData is too large scale down the image
    
            // Get the current image size
            CGSize currentSize = CGSizeMake(image.size.width, image.size.height);
    
            // Resize the image
            image = [image resizedImage:CGSizeMake(roundf(((currentSize.width/100)*80)), roundf(((currentSize.height/100)*80))) interpolationQuality:kMESImageQuality];
    
            // Pass the NSData out again
            imageData = UIImageJPEGRepresentation(image, kMESImageQuality);
    
        }
    }
    

    我不建议递归调整图像大小.每次调整大小时,都会失去一些质量(通常表现为图像的"软化",细节丢失,累积效应).您总是希望返回原始图像并调整尺寸越来越小的尺寸.(作为一个小问题,这个if陈述也是多余的.)

    我可能会建议以下内容:

    NSData  *imageData    = UIImageJPEGRepresentation(image, kMESImageQuality);
    double   factor       = 1.0;
    double   adjustment   = 1.0 / sqrt(2.0);  // or use 0.8 or whatever you want
    CGSize   size         = image.size;
    CGSize   currentSize  = size;
    UIImage *currentImage = image;
    
    while (imageData.length >= (1024 * 1024))
    {
        factor      *= adjustment;
        currentSize  = CGSizeMake(roundf(size.width * factor), roundf(size.height * factor));
        currentImage = [image resizedImage:currentSize interpolationQuality:kMESImageQuality];
        imageData    = UIImageJPEGRepresentation(currentImage, kMESImageQuality);
    }
    

    请注意,我没有触摸image原始图像,而是currentImage通过每次从原始图像调整大小来进行分配,每次都按比例递减.

    顺便说一句,如果你想知道我的神秘1.0 / sqrt(2.0),我试图在你的迭代80%因素和我希望以2的力量调整大小的愿望之间达成妥协(因为当一个权力完成时,减少保持更多的锐度2).但要使用adjustment你想要的任何因素.

    最后,如果您在巨大的图像上执行此操作,您可能会考虑使用@autoreleasepool块.您需要在"仪器中的分配"中分析您的应用程序并查看高水位线的位置,因为在没有自动释放池的情况下,这可能构成相当积极的内存使用.

    2023-02-12 17:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有