gpt4 book ai didi

ios - 缩小 UIImage 以适应最大 Base64 长度

转载 作者:行者123 更新时间:2023-11-28 07:04:12 25 4
gpt4 key购买 nike

在我的应用程序中,我必须以 Base64 字符串的形式将 UIImage 上传到服务器,条件是该字符串不得超过 54999 个字符。

我目前使用的代码通常有效,但它需要大量时间、内存,并且上传的图像 Base64 字符串的长度通常与 54999 相差甚远。有时甚至相差 10 倍。

var imageData = UIImagePNGRepresentation(image)
var base64String = imageData.base64EncodedStringWithOptions(.allZeros)

var scaledImage: UIImage = image
var newSize: CGSize = image.size

while ((base64String as NSString).length > 54999)
{
newSize.width *= 0.5
newSize.height *= 0.5

scaledImage = image.imageScaledToFitSize(newSize)

imageData = UIImagePNGRepresentation(scaledImage)
base64String = imageData.base64EncodedStringWithOptions(.allZeros)
}

// proceed to upload Base64 string...

一开始我以为我可以通过以下方式实现,但这显然根本行不通,因为文件大小与其 Base64 长度之间没有线性相关性:

let maxLength: NSInteger = 54999

if ((base64String as NSString).length > maxLength)
{
let downScaleFactor: CGFloat = CGFloat(maxLength) / CGFloat((base64String as NSString).length)

var size: CGSize = image.size
size.width *= downScaleFactor
size.height *= downScaleFactor

scaledImage = image.imageScaledToFitSize(size)

imageData = UIImagePNGRepresentation(scaledImage)
base64String = imageData.base64EncodedStringWithOptions(.allZeros)
}

必须有更好的方法来做到这一点。

最佳答案

这是一个棘手的问题。 base64 编码可预测图像大小的减少(3 字节变为 4,或大小增加 33%)

您无法确定 PNG 或 JPEG 压缩的结果大小,因为字节大小的减少取决于被压缩的图像。 (纯色矩形压缩得非常好。使用纯色的卡通片压缩得很好,而具有大量细节的连续色调照片也不会压缩。)

使用 JPEG 图像可能会更好,因为您可以调整这些图像的压缩级别,而 JPEG 提供更高的压缩率。

我建议尝试使用您可以容忍的最低图像质量(使用质量设置 .5,查看图像,然后从那里向上/向下调整,直到您获得看起来“足够好”的图像。)

然后使用该压缩。您可以跳过 base64 编码直到结束,因为您可以简单地将非 base64 字节大小乘以 4/3 以获得 base64 编码后的大小。

我建议将图像缩小 1/sqrt(2) (~0.7) 而不是 0.5。减少 50% 将导致图像尺寸大幅跳跃。

关于ios - 缩小 UIImage 以适应最大 Base64 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31220725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com