更改 UIImage 的 NSData 大小 - 使用最大兆字节 Mb 限制压缩并调整 UIImage 大小

2023-12-22

我有一个用户上传的 UIImage。

如果图像数据超过 10 Mb,如何将其大小调整为最大 10 Mb?到目前为止,我发现的最接近数据调整大小的方法是:

NSData *imageData = UIImageJPEGRepresentation(theUploadedImage.image, 0.5f);

但我似乎无法控制文件大小的 Mb...只是 JPG 表示中的第二个参数(图像质量浮动)


必须创建我自己的函数,将图像压缩得尽可能小,如果它仍然超过我的“最大尺寸”,那么它会调整大小、保留并再次开始压缩迭代。如果图像超过文件大小,这可以很好地使图像尽可能接近目标“最大图像文件大小”。还包括 1024 次迭代后的故障保护。 (这永远不会超过一分钟(但这种情况永远不会发生......谁在 iPhone 上使用千兆字节的图像?哈哈))......

-(void)shrinkImage {


    //IMPORTANT!!! THIS CODE WAS CREATED WITH "ARC" IN MIND... DO NOT USE WITHOUT ARC UNLESS YOU ALTER THIS CODE TO MANAGE MEMORY


    float compressionVal = 1.0;
    float maxVal = 9.7;//MB

    UIImage *compressedImage = theUploadedImage.image; //get UIImage from imageView

    int iterations = 0;
    int totalIterations = 0;

    float initialCompressionVal = 0.00000000f;

    while (((((float)(UIImageJPEGRepresentation(compressedImage, compressionVal).length))/(1048576.000000000f)) > maxVal) && (totalIterations < 1024)) {

        NSLog(@"Image is %f MB", (float)(((float)(UIImageJPEGRepresentation(compressedImage, compressionVal)).length)/(1048576.000000f)));//converts bytes to MB

        compressionVal = (((compressionVal)+((compressionVal)*((float)(((float)maxVal)/((float)(((float)(UIImageJPEGRepresentation(compressedImage, compressionVal).length))/(1048576.000000000f)))))))/(2));
        compressionVal *= 0.97;//subtracts 3% of it's current value just incase above algorithm limits at just above MaxVal and while loop becomes infinite.

        if (initialCompressionVal == 0.00000000f) {
            initialCompressionVal = compressionVal;
        }

        iterations ++;

        if ((iterations >= 3) || (compressionVal < 0.1)) {
            iterations = 0;
            NSLog(@"%f", compressionVal);

            compressionVal = 1.0f;


            compressedImage = [UIImage imageWithData:UIImageJPEGRepresentation(compressedImage, compressionVal)];



            float resizeAmount = 1.0f;
            resizeAmount = (resizeAmount+initialCompressionVal)/(2);//percentage
            resizeAmount *= 0.97;//3% boost just incase image compression algorithm reaches a limit.
            resizeAmount = 1/(resizeAmount);//value
            initialCompressionVal = 0.00000000f;


            UIView *imageHolder = [[UIView alloc] initWithFrame:CGRectMake(0,0,(int)floorf((float)(compressedImage.size.width/(resizeAmount))), (int)floorf((float)(compressedImage.size.height/(resizeAmount))))];//round down to ensure frame isnt larger than image itself

            UIImageView *theResizedImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,(int)ceilf((float)(compressedImage.size.width/(resizeAmount))), (int)ceilf((float)(compressedImage.size.height/(resizeAmount))))];//round up to ensure image fits
            theResizedImage.image = compressedImage;


            [imageHolder addSubview:theResizedImage];


            UIGraphicsBeginImageContextWithOptions(CGSizeMake(imageHolder.frame.size.width, imageHolder.frame.size.height), YES, 1.0f);
            CGContextRef resize_context = UIGraphicsGetCurrentContext();
            [imageHolder.layer renderInContext:resize_context];
            compressedImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();


            //after 3 compressions, if we still haven't shrunk down to maxVal size, apply the maximum compression we can, then resize the image (90%?), then re-start the process, this time compressing the compressed version of the image we were checking.

            NSLog(@"resize");
        }

        totalIterations ++;

    }

    if (totalIterations >= 1024) {
        NSLog(@"Image was too big, gave up on trying to re-size");//too many iterations failsafe. Gave up on trying to resize.
    } else {

        NSData *imageData = UIImageJPEGRepresentation(compressedImage, compressionVal);
        NSLog(@"FINAL Image is %f MB ... iterations: %i", (float)(((float)imageData.length)/(1048576.000000f)), totalIterations);//converts bytes to MB

        theUploadedImage.image = [UIImage imageWithData:imageData];//save new image to UIImageView.

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 UIImage 的 NSData 大小 - 使用最大兆字节 Mb 限制压缩并调整 UIImage 大小 的相关文章

  • 如何等待 webViewDidFinishLoad 完成

    我有一个初始化 webView 的布尔条件 并在 webViewDidFinishLoad 中加载另一个委托 以便在完成完成后触发 但是 由于布尔值在条件 webViewDidFinishLoad 之前返回 因此页面永远不会完全加载 如何确
  • 对 UIImage 进行方形裁剪,导致图像拉伸

    当尝试执行 UIImage 的中心裁剪时 我得到以下结果 左侧是原始图像640 1136 右边是适合正方形的裁剪图像UIImageView at 320 320 turns to 我对比率元素进行了相当多的修改 以便它可以正确检测要修剪的量
  • 尝试从独立的 Apple Watch 应用发出网络请求

    当应用程序是独立应用程序时 Apple Watch 是否无法进行网络通话 即使手表已连接到 iPhone 我正在使用新的独立应用程序目标 它没有附带可以发出 WatchConnectivity 请求的配对 iOS 应用程序 我十有八九收到
  • iOS 外部附件框架:如何获取特定 MFI 设备的协议字符串

    我正在编写一个 iOS 应用程序 用于与 mini mPlay Drumi MP18B 小型蓝牙扬声器 进行通信 据我所知 showBluetoothAccessoryPickerWithNameFilter仅显示协议字符串添加到 Info
  • iOS 中的等宽字体是什么?

    我想要在我的 iOS 应用程序中为 UILabel 使用等宽字体 不幸的是 我找不到一个 甚至 美国打字机 实际上也不是等宽的 XCode 中可用的等宽字体是什么 iOS 等宽字体 Courier Courier Bold Courier
  • 使用反射的属性类型或类

    我想知道是否可以确定对象属性的类或原始类型 获取所有属性名称和值非常容易 所以答案 https stackoverflow com questions 2299841 objective c introspection reflection
  • 更改 UITextField 辅助功能描述

    有没有办法将 UITextField 的辅助功能标签设置为 文本字段 之外的其他内容 因此 我不想将其称为 文本字段 而是将其命名为 代码验证字段 我的建议是不要试图在内置语音输出上智取系统 对于盲人用户来说 文本字段正在编辑 相当于 该项
  • swift 中的负数模

    负数模如何在 swift 中工作 当我执行 1 3 时 它给出 1 但余数是 2 其中有什么问题 雨燕余数运算符 计算余数 整数除法 a b a a b b where 是截断整数除法 在你的情况下 1 3 1 1 3 3 1 0 3 1
  • 在WKWebview中设置useragent

    如何在 WKWebView 中设置自定义用户代理字符串 我正在尝试嵌入我的应用程序的版本 以便我的服务器端可以看到可用的功能 我找到了以下方法 let userAgent MyApp 1 33 7 request setValue user
  • 在 Swift 中检查一个数组是否包含另一个数组的所有元素

    我想为数组编写一个扩展来检查一个数组是否包含另一个数组的所有元素 在我的用例中它是字符串对象 但我一直得到 Cannot convert value of type T Generator Element to expected argum
  • 如果 NSExtensionActivationRule 设置为仅音频,则共享扩展不会出现在有功能的应用程序中

    我正在尝试创建一个共享扩展 用户可以从任何有能力的应用程序上传她的录音 该文档甚至有一个简单的示例 请参阅声明共享或操作扩展支持的数据类型 https developer apple com library content document
  • 如何添加授权以从新钥匙串对应用程序进行代码签名,而无需任何人工交互

    我正在尝试使用特定证书自动化构建 iPhone 应用程序的过程 因此 想象一下 如果不同的用户将他们的证书上传到系统中 并且可以立即用于代码签名 我想在没有任何交互的情况下做到这一点 我也不想用不同的用户证书弄乱系统或登录钥匙串 为此我有
  • SecItemAdd 创建两个身份

    我正在为 iPhone 开发一个应用程序 需要证书来调用某些服务 因此我将证书添加到我的钥匙串中 执行以下操作 SecCertificateRef cert SecCertificateCreateWithData NULL bridge
  • 打印附加结构(swift 4)

    我有三个 textifled 用于将数据附加到结构中 如何打印我附加的内容 现在我收到一条错误消息 import UIKit class ViewController UIViewController IBOutlet var c UITe
  • UIImage:如何获取网站选项卡图标

    我正在开发一个 RSS 阅读器 我需要获取每个提要的图标 例如 如果我的提要是 google com 我想获取 G 图标并将其放入 UIImage 或其他内容中 关于如何实现这一目标有什么想法吗 最简单的方法是使用 Google NSStr
  • 增加 NSData 的长度

    基本上 我有一个 46 个字符的 NSString 我将其转换为 NSData 我需要将字符串填充到 48 个字符 仅在 NSString 末尾添加 是行不通的 所以 我只是使用以下方法增加了 NSData 的长度 NSString str
  • Swift 中 UIImages 的淡入淡出动画

    我有一组图像 我希望它们在登录屏幕的背景中淡出 我无法在 swift 中找到任何可以做到这一点的东西 有什么办法我可以做到吗 这是我当前的代码 override func viewDidLoad super viewDidLoad star
  • 如何自动为 Swift 类创建初始化程序?

    UPDATE 使用结构而不是类 struct 在很多方面都更好 它有自己的初始化器 这是我的模型课 是否有可能创建init自动方法 每次我都必须将所有变量一一初始化 这会花费很多时间 class Profile var id String
  • iOS 发送 iMessage 尽可能简单

    我希望能够以编程方式发送 iMessage 除了调用一个将文本发送到带有消息的号码的函数之外 无需执行任何其他操作 这两个消息都是文本框 我真的很感激一些示例代码 因为我在网上搜索过 但我发现没有任何帮助 这不适用于商业应用程序 仅适用于我
  • 当设置 setVisibleXRangeMaximum 时,iOS-Charts X 轴值无限重复

    我正在尝试绘制一个图表 其中 x 轴是TimeIntervalY 轴是power consumption 由于每天都会有数据 因此将有太多数据无法显示 因此 我想一次显示 5 个值 我通过设置实现了这一点self chart setVisi

随机推荐

  • Lucene不能查询null?

    我们如何构造一个查询来搜索特定字段不为空 field name 不管用 我试过field name a to z 这对于英语来说效果很好 但并不涵盖所有语言 还有其他建议吗 我发现这在某些情况下有效field 0 TO 9 a TO z
  • 选择 Rails 主机 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我即将挑选一个 Rails 主机 我think我需要一个 VPS 解决方案 因为 1 我的 Rails 应用程序有需要安装才能使其正常工作的 g
  • 在R中找出一个月的天数

    我在P有个约会 date as Date 2011 02 23 Y m d 是否可以找出该特定日期该月的天数 关于闰年 在 PHP 中 它看起来与此类似 http www php net manual en function date ph
  • javax.mail.internet.ParseException:需要“/”,已获取文件

    我在尝试发送带有文件附件的电子邮件时遇到错误 javax mail internet ParseException Expected got files at javax mail internet ContentType
  • C++,确定素数

    我昨天开始读一本关于C 的书 到目前为止 我已经写了 100 页 并用这个数字来编写我的第一个程序 我想让它找出给定的数字是否是素数 我对此有 2 个问题 我知道我的方法并不好 该程序正在检查每个数字 这使得程序变得很大 做到这一点的理想方
  • 根据颜色分割图像中的像素(Matlab)

    我正在尝试仅使用颜色信息 目前 来分割包含多个乐高积木的图像 目的是找到乐高积木 例如是绿色的 我尝试过使用 k 均值聚类 但给定的不同颜色砖块的数量各不相同 我还尝试使用 Matlab 中的以下示例website http uk math
  • 如何修复 TypeError:无法从 Express Nodemailer 读取属性“名称”

    所以我想说 我一直在寻找这个问题的答案 我也尝试控制台记录我的 req body 帖子表单 但我一直得不到定义 所以我觉得我正在丢失发送的表单中的数据 我不确定我做错了什么 所以是时候展示一些代码了 请注意 我使用 Handlebars 进
  • 用烧瓶计算唯一访客数

    我想计算唯一访问者的数量并将该数字存储在我的数据库中 我知道我可以通过以下方式获取 IP 地址 request remote addr 所以我的默认计划是在我的数据库中存储这个地址和时间戳 对于任何新访问者 我都会比较该 IP 地址是否已添
  • 我可以在 PHP 中使用多个类来扩展一个类吗?

    如果我有几个具有我需要的功能的类 但想单独存储以进行组织 我可以扩展一个类以同时拥有这两个功能吗 i e class a extends b extends c 编辑 我知道如何一次扩展一个类 但我正在寻找一种方法来立即使用多个基类扩展一个
  • Box2D 碰撞错误

    我目前在 libgx 中使用 java 中的 box2d 物理引擎 并且面临碰撞问题 问题是身体停止移动 并且在平坦区域上出现碰撞点 我的工作方式是制作多个主体 每个主体代表一个块 并且这些块是并排的 看这里的碰撞点 物体在这里不应该碰撞
  • 将 Map 转换为 json

    I have Map
  • 无法绑定到“control”,因为它不是 (myComponent) 的已知属性

    这是我的 app module ts import NgModule from angular core import BrowserModule from angular platform browser import HttpModul
  • 将 null 值表示为 xml jaxb 中的空元素

    我需要在 jaxb 中将 null 值显示为空元素 我正在使用 jaxb 的 moxy 实现 我找到了这个选项 XmlNullPolicy emptyNodeRepresentsNull true nullRepresentationFor
  • 回收视图膨胀不同的行:- 绑定数据时出现异常

    我正在研究Recyceview具有不同的项目通货膨胀 当我NOT将数据绑定到onBindViewHolder的方法RecycleView比它不崩溃 但是当我绑定里面的数据时onBindViewHolder比我得到的Exception 请检查
  • git push origin main 之后,没有任何反应

    我正在尝试将一个包含 100 多个文件的项目上传到 github 这些是 GitHub 希望我在 Git Bash 终端上执行的步骤 cd
  • javafx.scene.image.Image("flower.png") 在哪里寻找flower.png?

    我想知道JavaFX Image构造函数的相对路径解析算法的用途 独立应用程序 浏览器部署的应用程序 Webstart 部署的应用程序 如果该算法可能会在多个位置查找 我想知道它们对于上述每个部署场景的作用 如果将应用程序放入 jar 中时
  • 使用会话变量有多安全 - asp.net / c#

    所以基本上我想知道我使用会话变量的方式有多安全 我有一个登录表单 用户在其中输入用户名 密码 然后对其进行参数化 然后进行查询 如果用户名 密码存在 则从数据库表返回用户ID 这对于每个用户来说都是独一无二的 当我有这个值时 我想知道这种方
  • Lodash:当我嵌套对象时如何使用过滤器?

    考虑这个例子 我在用Lodash http lodash com docs data category uri categories 0b092e7c 4d2c 4eba 8c4e 80937c9e483d parent Food name
  • 在普通函数内调用挂起函数

    我想在普通函数中调用阻塞挂起函数 但不阻止线程完成挂起函数然后返回Response override fun intercept chain Interceptor Chain Response getSession is a suspen
  • 更改 UIImage 的 NSData 大小 - 使用最大兆字节 Mb 限制压缩并调整 UIImage 大小

    我有一个用户上传的 UIImage 如果图像数据超过 10 Mb 如何将其大小调整为最大 10 Mb 到目前为止 我发现的最接近数据调整大小的方法是 NSData imageData UIImageJPEGRepresentation th