UIImagePickerController - 如何将图像保存到核心数据?

时间:2014-02-04 12:55:43

标签: ios iphone core-data uiimagepickercontroller

我有一个应用,它使用UIImagePicker让用户拍照或从图库中选择一张照片。到目前为止,挑选和展示工作,但我需要一些指导做什么和下一步。 这是我的委托方法:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.userImageView.image = chosenImage;

    [picker dismissViewControllerAnimated:YES completion:NULL];    
}

因此,捕获/选定的图像可以很好地显示在UIImageView

保存它的最佳方法是什么? 将image本身保存到Core Data,还是只保存在文件系统中的URL? 如何获取文件系统中的URL? 是否重要,如果用户拍摄照片,或从图库中选择它? 任何提示,想法,赞赏,谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将image保存到核心数据中,方法是将其转换为NSData对象。当你想将它显示回UIImageView时,你必须将它转换回UIImage对象。你可以通过这种方式轻松完成这项工作。

NSData* data = UIImageJPEGRepresentation(myImage, COMPRESSION_QUALITY);

通过这种方式,您可以将数据转换回图像

UIImage *image = [UIImage imageWithData:data];

这是将image转换为data的方式,反之亦然。您应该保存此图像的位置取决于尺寸和要求。

您可以将image保存到核心数据,但这会使您的核心数据对象占用更多内存。如果您仍想在核心数据中保存图像,请为image创建单独的实体,并在其他实体中为图像创建引用,这样通过错误将节省一些内存。

您还可以将文件保存在文件系统中,并将核心数据保存为字符串。

答案 1 :(得分:0)

根据Apple文档:(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html

  

大型数据对象(BLOB)

     

如果您的应用程序使用大型BLOB(“二进制大对象”,如   图像和声音数据),您需要注意尽量减少开销。   “小”,“适度”和“大”的确切定义是流动的   取决于应用程序的用法。一个宽松的经验法则是   大小为千字节的对象是“适度”大小的   那些大小为兆字节的大小是“大”的。一些   开发人员使用10MB BLOB实现了良好的性能   数据库。另一方面,如果应用程序有数百万行   一个表,甚至128个字节可能是一个“适度”大小的CLOB(字符   需要将规范化为单独的表的大型对象。

     

通常,如果您需要将BLOB存储在持久存储中,那么   应该使用SQLite商店。 XML和二进制存储需要   整个对象图驻留在内存中,而存储写入是原子的(参见   “持久存储功能”)意味着它们不能有效   处理大型数据对象。 SQLite可以扩展以进行极端处理   大型数据库。正确使用,SQLite提供了良好的性能   数据库最高可达100GB,单行最多可容纳1GB(尽管如此)   当然,将1GB数据读入内存是一项昂贵的操作   无论存储库有多高效。)

     

BLOB通常表示实体的属性 - 例如,a   照片可能是Employee实体的属性。小到   适度大小的BLOB(和CLOB),您应该创建一个单独的实体   为数据和创建一个一对一的关系代替   属性。例如,您可以创建员工和照片   它们之间具有一对一关系的实体,其中   从员工到照片的关系取代了员工   照片属性。这种模式最大化了对象的好处   错误的(参见“Faulting and Uniquing”)。任何给定的照片都是   如果确实需要(如果遍历关系)则检索。

     

但是,如果您能够将BLOB存储为资源,那就更好了   文件系统,并保持链接(如URL或路径)   资源。然后,您可以在必要时加载BLOB。

因此,根据图像的大小,您可以在CoreData中保存路径或图像。

要保存UIImage,您必须在NSData中对其进行转换:

  

NSData imageData = UIImagePNGRepresentation(myImage);   NSData imageData = UIImageJPEGRepresentation(myImage,QUALITY);

然后您可以将其保存在您选择的路径中:

  

[imageData writeToFile:fullPath atomically:YES];

我倾向于总是使用路径,即使是小图像,也能保持数据模型工作方式的连续性。