Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 图像压缩质量不是线性的_Ios_Swift_Core Data_Uiimage_Compression - Fatal编程技术网

Ios 图像压缩质量不是线性的

Ios 图像压缩质量不是线性的,ios,swift,core-data,uiimage,compression,Ios,Swift,Core Data,Uiimage,Compression,我想将UIImage保存到CoreData实体 根据,为了将此UIImage保存到同一实体表中,建议UIImage的大小应小于100kb 因此,当用户从UIImagePickerController(无论是库还是相机)获取UIImage时,我希望使用UIImageJPEGRepresentation@CompressionQuality rate来呈现小于100kb的UIImage数据 玩弄 let imgData: NSData = UIImageJPEGRepresentation(Came

我想将UIImage保存到CoreData实体

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

因此,当用户从UIImagePickerController(无论是库还是相机)获取UIImage时,我希望使用UIImageJPEGRepresentation@CompressionQuality rate来呈现小于100kb的UIImage数据

玩弄

let imgData: NSData = UIImageJPEGRepresentation(CameraImage, <#compressionQuality: CGFloat#>)
let size = imgData.length
我意识到0.8并不等于1.0压缩的80%数据大小

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


注意:我最初的想法是测试UIImage的大小,然后以@rate X=100000/大小压缩它

您不需要将图像缩小到100kb以下,只需创建一个binary类型的Coredata属性并勾选Allows External Storage(允许外部存储)框。Coredata将为您解决其余问题:

创建一个名为imageData的二进制类型属性,并允许外部存储 创建一个名为“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实体,并显示每个条目的图像可能有200多个图像…除非这些图像被压缩,否则可能会使应用程序崩溃,不是吗?在这种情况下,您还应该创建一个缩略图大小的图像版本以显示在TableView中。这并不是严格必要的,因为如果您正确操作,则只有显示的单元格才会加载图像,即在任何给定时间屏幕上可能会显示5-10个图像,并且当用户滚动时,在加载新图像的同时卸载图像。