UIImage CompressionQuality不是线性的

时间:2015-04-28 04:56:13

标签: ios swift core-data uiimage compression

我想将UIImage保存到CoreData实体。

Per accepted answer here,为了将这个UIImage保存到同一个实体表中,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 Entity中?

注意:我最初的想法是测试UIImage的size然后压缩它@&#34;率X = 100,000 / size&#34;

1 个答案:

答案 0 :(得分:0)

您不需要将图像缩小到100kb以下,您只需创建二进制类型的Coredata属性并勾选“允许外部存储”框。 Coredata将为您处理剩下的事情:

  1. 创建名为imageData的二进制类型属性并允许外部存储
  2. 创建名为“image”的瞬态属性,并按以下方式实现自定义getter和setter:
  3. 大于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;
    }