【问题标题】:UIImage CompressionQuality not LinearUIImage CompressionQuality不是线性的
【发布时间】:2015-07-06 18:49:40
【问题描述】:

我想将 UIImage 保存到 CoreData 实体。

根据accepted answer here,为了将此 UIImage 保存到同一个实体表中,建议 UIImage 的大小应为

因此,当用户从 UIImagePickerController(库或相机)获取 UIImage 时,我想做一个 UIImageJPEGRepresentation @CompressionQuality 速率来呈现此 UIImage 数据

玩弄

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

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


我如何获取任何大小的 UIImage 并将其压缩为数据: 大小为 最大 100kb,以便在允许大小要小到足以存储在 CoreData 实体中?

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

【问题讨论】:

    标签: ios swift core-data uiimage compression


    【解决方案1】:

    您不需要将图像缩小到 100kb 以下,您只需创建一个二进制类型的 Coredata 属性并勾选“允许外部存储”框。 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;
    }
    

    【讨论】:

    • 好的,但我有一个 TableView,它显示所有 CoreData 实体 Person 并显示每个条目的图像(可能 200 多个图像)......除非这些图像被压缩,否则可能会导致应用程序崩溃,不是吗?
    • 在这种情况下,您还应该创建图像的缩略图大小版本以显示在表格视图中。这不是绝对必要的,因为如果您正确执行操作,只有正在显示的单元格会加载图像(即,您可能在任何给定时间在屏幕上显示 5-10 个图像,并且当用户滚动时卸载图像而新的图像已加载)。
    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2014-10-07
    • 2019-05-17
    相关资源
    最近更新 更多