UIImage CompressionQuality 不是线性的

UIImage CompressionQuality not Linear

我想将 UIImage 保存到 CoreData 实体。

根据 accepted answer here,为了将此 UIImage 保存到同一实体 Table,建议的 UIImage 大小应小于 100kb

因此,当用户从 UIImagePickerController(库或相机)获取 UIImage 时,我想做一个 UIImageJPEGRepresentation @ CompressionQuality 渲染此 UIImage 数据的速率 < 100kb

let imgData: NSData = UIImageJPEGRepresentation(CameraImage, <#compressionQuality: CGFloat#>)
let size = imgData.length

我意识到 0.8 不等于 1.0 压缩的 80% 数据大小。


我如何获取任意大小的任何 UIImage 并将其压缩为数据:,最大大小为 100kb,以便保持尽可能多的完整性,同时允许大小小到足以存储在 CoreData 实体中?

注意:我最初的想法是测试 size 的 UIImage 然后压缩它 @ "rate X = 100,000/size"

您不需要将图像缩小到 100kb 以下,您所要做的就是创建一个二进制类型的 Coredata 属性并勾选 "Allows External Storage" 框。 Coredata 会为您处理剩下的事情:

  1. 创建一个名为 imageData 的二进制类型的属性并允许外部存储
  2. 创建一个名为 'image' 的瞬态属性并按照以下方式实现自定义 getter 和 setter:

大于 1MB 的文件将存储在相对于数据库文件夹的单独文件夹中,而较小的文件将直接保存到 sqlite 文件中。

- (void)setImage:(UIImage*)image
{
    NSData *data = UIImageJPEGRepresentation(image, 0.5);
    if (data) {
        [self setImageData:data];
    }
}

- (UIImage*)image
{
    UIImage *image = [UIImage imageWithData:self.imageData];
    return image;
}